Analysis Notebook

Introduction to the dataset and experimental design



This Rmarkdown notebook describes the analysis of bulkRNAseq data of Amphiprion ocellaris larvae treated with a selection of drugs from 8dph to 13dph (5 days total), i.e. until control larvae had metamorphosed. The aim of the experiment was to detect the general effects of the organophosphate pesticide Chlorpyrifos (CPF) on clownfish larvae as they undergo metamorphosis, and specifically on their thyroid hormone signalling pathway. n=10 larvae were collected at the end of each of the 5 treatments (i.e. at 13dph), RNA was extracted from each larva, and RNA was sequenced (total n=50). Treatments: DMSO (control), T3+IOP (positive control, induction of metamorphosis), MPI (negative control, blockade of metamorphosis), CPF (test drug), CPF+T3+IOP.



Gene level read quantification

Importing counts and sample metadata


Step 1: We start by creating a data-table summarising sample metadata


Step 2: we will take the chance here to create another quality control step: the number or reads processed and the number + percentage of those reads that could be mapped by salmon.

[1] "Expected number of total reads/lane (P3cell):  14 millions"
[1] "Median number of total reads/lane:  11.97 millions"
[1] "Median number of mapped reads/lane:  10.19 millions"
[1] "Average mapping percentage/lane:  85.12 %"


Step 3: Transcripts need to be associated with gene IDs for gene-level summarization. For Salmon, Sailfish, and kallisto the files only provide the transcript ID. We first make a data.frame called tx2gene with two columns: 1) transcript ID and 2) gene ID. The column names do not matter but this column order must be used. The transcript ID must be the same one used in the abundance files.

Import genomic features from the file as a GRanges object ... OK
Prepare the 'metadata' data frame ... OK
Make the TxDb object ... Warning: some transcripts have no "transcript_id" attribute ==> their name ("tx_name"
  column in the TxDb object) was set to NAWarning: the transcript names ("tx_name" column in the TxDb object) imported from the
  "transcript_id" attribute are not uniqueOK
 [1] "CDSCHROM"   "CDSEND"     "CDSID"      "CDSNAME"    "CDSPHASE"   "CDSSTART"  
 [7] "CDSSTRAND"  "EXONCHROM"  "EXONEND"    "EXONID"     "EXONNAME"   "EXONRANK"  
[13] "EXONSTART"  "EXONSTRAND" "GENEID"     "TXCHROM"    "TXEND"      "TXID"      
[19] "TXNAME"     "TXSTART"    "TXSTRAND"   "TXTYPE"    
'select()' returned 1:1 mapping between keys and columns

Salmon output transcript-based quantification files (quant.sf) are imported in RStudio and summarised at the gene level using the tximport function from the tximport package (RRID:SCR_016752; Soneson et al., 2015), referencing the gene models of Amphiprion ocellaris reference genome assembly ASM2253959v1. The counts matrix is obtained by re-calculating counts through the flag countsFromAbundance = “lengthScaledTPM”.

reading in files with read_tsv
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 
summarizing abundance
summarizing counts
summarizing length

Giving the following count matrix (first rows only, shown here)

          DMSO_1_L001 DMSO_1_L002 DMSO_2_L001 DMSO_2_L002 DMSO_3_L001 DMSO_3_L002
111562382   174.49927   155.01513   243.44150   236.60197   229.67726    213.4546
111562384    85.27148    67.18561   104.56237   106.52691    96.54412    120.8456
111562387   344.31048   324.44902   455.45251   449.47389   390.32455    354.2029
111562388   109.66176   113.74703   158.98551   156.87357   137.87634    146.7163
111562389   115.95570   119.07018    83.45771    76.24195   115.49280    117.4767
111562390   615.82549   498.81599   643.18265   623.10037   614.13545    496.1659
          DMSO_4_L001 DMSO_4_L002 DMSO_5_L001 DMSO_5_L002 DMSO_6_L001 DMSO_6_L002
111562382   179.15656   155.77403   184.40274   202.63497   195.10835    194.9388
111562384    62.48445    66.76861    85.14152    62.26721    89.03561    106.0413
111562387   274.46198   296.92529   358.87272   343.94857   392.83484    388.9179
111562388    97.07839   115.01655   111.59803   101.90645   153.35882    110.7220
111562389   102.56266   104.83907   126.85109   125.82110   124.33455    123.4520
111562390   511.18928   451.28487   582.24478   563.96261   624.85964    622.1594
          DMSO_7_L001 DMSO_7_L002 DMSO_8_L001 DMSO_8_L002 DMSO_9_L001 DMSO_9_L002
111562382   167.25224   149.36060    214.1726   198.28576    190.1222   178.77244
111562384    74.53525    71.04665    109.4157    68.00025    105.6287    85.22376
111562387   477.23735   422.17716    422.1399   374.03702    359.6164   343.10091
111562388   115.47017   112.89865    111.2855   125.98404    124.8813   117.71145
111562389   102.45378    89.71627    137.7581   115.06824    134.5694   109.72243
111562390   671.16469   628.24405    618.3855   533.81812    634.0491   587.44159
          DMSO_10_L001 DMSO_10_L002 T3IOP_1_L001 T3IOP_1_L002 T3IOP_2_L001 T3IOP_2_L002
111562382    261.03752    212.65119     245.3586    216.29409     344.4239     329.3328
111562384     90.75693     97.95856     119.7603    108.05098     121.8247     107.8747
111562387    330.65116    331.26688     483.9010    441.66918     515.8391     470.2383
111562388    145.79954    127.02024     101.3422     86.97984     148.9324     149.4578
111562389    121.50721    148.75099     141.4935    126.84049     130.2880     112.3220
111562390    563.75717    563.54146     624.0920    560.01498     618.1341     579.2623
          T3IOP_3_L001 T3IOP_3_L002 T3IOP_4_L001 T3IOP_4_L002 T3IOP_5_L001 T3IOP_5_L002
111562382    222.89618    232.37461    233.71160    265.58786    279.94761    296.71854
111562384     78.00563     86.99129     95.81763     77.86007     98.15427     96.10638
111562387    365.92370    329.36678    370.90553    385.91696    297.17730    325.76390
111562388    112.33992     89.41192    131.67561    101.84649    127.72516     91.41058
111562389    115.30082    105.11769    110.90219    123.88338    103.02913    104.12463
111562390    428.26314    442.19840    495.76038    433.81402    409.98397    381.99520
          T3IOP_6_L001 T3IOP_6_L002 T3IOP_7_L001 T3IOP_7_L002 T3IOP_8_L001 T3IOP_8_L002
111562382    274.29383     279.1833    240.24271    265.18012    207.48094    211.20141
111562384     89.13959     119.9247     97.32910     88.29723     78.28923     97.46790
111562387    385.04857     362.5347    359.07718    319.97562    471.34108    425.87513
111562388    117.08165     125.7437     96.17673     94.60925    121.52339     86.21991
111562389    123.97308     136.4261    117.48356     91.62023     96.41757     90.22210
111562390    479.88948     517.3039    470.81316    397.12914    613.38273    522.95053
          T3IOP_9_L001 T3IOP_9_L002 T3IOP_10_L001 T3IOP_10_L002 MPI_1_L001 MPI_1_L002
111562382     270.2915    229.00931      297.7791     288.71756  180.11282  163.04481
111562384     102.6530     83.23698      108.0160      99.47370   89.02595   76.46529
111562387     408.1966    398.36347      427.3041     336.27062  216.14249  252.71947
111562388     133.7920    117.12194      149.5709     115.85962  110.25600   95.81815
111562389     111.7951    123.05926      104.5029      84.86838  125.78927  110.82192
111562390     633.6103    551.98987      399.8288     423.91686  486.05008  435.89843
          MPI_2_L001 MPI_2_L002 MPI_3_L001 MPI_3_L002 MPI_4_L001 MPI_4_L002 MPI_5_L001
111562382   189.7147  132.15352  205.66363   200.9395   235.6264   257.9170   224.9165
111562384   106.5600   83.33481   87.33034   100.0202   186.4960   157.4411   113.3053
111562387   307.9446  282.29500  382.63849   351.8394   493.6531   474.1928   435.6347
111562388   133.1730   93.43760  131.66876   119.8062   185.3451   130.5302   128.5497
111562389   123.1416  105.21880  122.94080   103.6464   151.0294   136.3279   113.2497
111562390   515.0996  439.71438  524.92603   479.4113   769.9098   642.3746   609.5665
          MPI_5_L002 MPI_6_L001 MPI_6_L002 MPI_7_L001 MPI_7_L002 MPI_8_L001 MPI_8_L002
111562382  210.22161   263.1316  271.16831   128.7042  118.58025   245.7517  175.77239
111562384   67.63475   169.1850  159.81788   125.4149  114.80072   101.2239   92.40544
111562387  402.38737   334.1766  283.31321   298.9213  329.30282   339.8667  263.56397
111562388  128.27394   147.8648  117.72585   131.5252  100.76532   117.8058  108.22243
111562389  110.69764   119.3306   97.02815   148.7625   96.50586   113.4863  112.00050
111562390  586.06219   516.4724  468.79087   486.8263  505.73047   471.1170  478.12951
          MPI_9_L001 MPI_9_L002 MPI_10_L001 MPI_10_L002 CPF_1_L001 CPF_1_L002 CPF_2_L001
111562382   315.9798  263.53210   340.93646   286.90998  314.68698   310.7790   268.8759
111562384   127.6321   75.37440    86.81161    85.41433  206.38214   176.4612   147.2713
111562387   358.8427  347.67937   481.23499   393.80918  424.49127   378.0380   522.9490
111562388   170.1223  135.64507   136.81824   119.48236  186.78947   179.2926   167.2089
111562389   123.4830   98.41378   111.58102   115.51053   85.69544   105.4417   125.0696
111562390   589.7763  547.11062   591.02914   582.65329  563.13010   450.8035   618.2207
          CPF_2_L002 CPF_3_L001 CPF_3_L002 CPF_4_L001 CPF_4_L002 CPF_5_L001 CPF_5_L002
111562382  210.03618   264.5331   255.4583   272.2664   279.4593  360.24938   333.1920
111562384  138.18565   101.8031   116.0798   150.8250   111.0829  176.06080   164.2611
111562387  459.96073   395.9295   347.0004   359.0079   312.9936  328.06958   303.5440
111562388  194.81672   144.3295   157.7885   138.6746   147.9768  254.68317   219.6172
111562389   89.71017   103.7674   106.7122   127.0001   111.0298   91.55575    94.0644
111562390  596.58965   497.1387   464.4037   520.0877   440.2759  496.07779   415.9939
          CPF_6_L001 CPF_6_L002 CPF_7_L001 CPF_7_L002 CPF_8_L001 CPF_8_L002 CPF_9_L001
111562382   301.7989   307.3282   265.5805   203.2814   242.5027   195.3063   183.3371
111562384   189.7308   155.4377   126.7522   119.5535   162.4235   138.2780   131.0619
111562387   342.0361   322.1199   474.4700   499.1928   413.7643   364.6644   373.1001
111562388   209.9633   174.0434   191.9434   193.6604   160.1680   157.8631   164.3745
111562389    96.5134    84.1090   142.1541   147.9641   117.9591   151.7439   126.2157
111562390   527.8405   433.9670   722.8828   649.8957   646.2303   596.4632   564.3842
          CPF_9_L002 CPF_10_L001 CPF_10_L002 CPF.T3IOP_1_L001 CPF.T3IOP_1_L002
111562382  190.39182    250.7338    225.2428         294.0099         246.0184
111562384   99.04989    119.9420    111.7895         117.7968         107.9069
111562387  341.74475    285.0139    279.4609         552.0897         511.8303
111562388  126.70850    164.8267    160.2755         161.3292         125.7272
111562389  116.37144    106.5926    118.1142         124.6086         137.3307
111562390  539.72880    325.9654    338.8546         547.9507         518.7638
          CPF.T3IOP_2_L001 CPF.T3IOP_2_L002 CPF.T3IOP_3_L001 CPF.T3IOP_3_L002
111562382         243.5936         247.0799        310.94402        266.70747
111562384         147.0141         158.6848        105.40969        126.35028
111562387         537.8212         448.2016        389.97434        357.37107
111562388         128.5554         120.2410        149.94394        139.31410
111562389         124.3283         136.1966         90.96512         86.52713
111562390         635.1143         601.9102        446.04206        370.86341
          CPF.T3IOP_4_L001 CPF.T3IOP_4_L002 CPF.T3IOP_5_L001 CPF.T3IOP_5_L002
111562382         336.1650        341.66850         231.7827         251.9496
111562384         147.6791        131.25056         119.9850         111.9610
111562387         332.1079        264.65628         381.4214         360.0748
111562388         173.3817        152.23589         151.4143         137.5173
111562389          98.8082         84.20097         152.4719         117.0637
111562390         397.2637        378.39184         609.7407         625.0679
          CPF.T3IOP_6_L001 CPF.T3IOP_6_L002 CPF.T3IOP_7_L001 CPF.T3IOP_7_L002
111562382         228.5020         242.9268         254.5090        258.14442
111562384         121.6659         136.4584         129.4447        122.64942
111562387         476.4058         463.1779         447.9883        440.60226
111562388         161.8704         138.7580         140.0269        141.77364
111562389         126.8840         139.4097         105.8712         98.13592
111562390         835.6492         738.4252         615.5554        618.13991
          CPF.T3IOP_8_L001 CPF.T3IOP_8_L002 CPF.T3IOP_9_L001 CPF.T3IOP_9_L002
111562382         232.7558         185.5054         286.0427         240.1374
111562384         126.8146         130.3076         147.9219         120.2160
111562387         475.6336         387.3153         410.9325         357.2355
111562388         149.5676         140.4665         149.7141         163.8598
111562389         115.7287         120.7027         147.4524         120.3669
111562390         650.3048         568.4508         596.0250         611.7181
          CPF.T3IOP_10_L001 CPF.T3IOP_10_L002
111562382          244.9702         218.98506
111562384          147.0980         133.72432
111562387          335.2116         289.98481
111562388          134.4904          93.35917
111562389          107.3636          94.01700
111562390          496.3520         468.82866
Asembling the DGE object


Step 1: We first collect the file with the sample metadata (as created earlier)


Step 2: We then collect the counts matrix as imported from Salmon with tximport


Step 3: Now, we can create a DGEList object. This is an object used by edgeR to store count data. It has a number of slots for storing various parameters about the data.


Step 4: We then collect the last missing piece of information, the gene metadata info (in this case, it is loaded from a custom-curated reference file based on the integration of Ensembl (still based on assembly AmpOce1.0) and NCBI annotations )


we loaded this information too into the DGE_list object, after manual annotation of some genes, and filling in of missing values.

[1] 26889
   Mode   FALSE    TRUE 
logical    2241   26889 

Quality Control and Filtering of lowly expressed genes

Quality Control of imported data

How is count data distributed? not normally, as shown by the plot below. Moreover, the variance is bigger than the mean, meaning that a negative binomial, rather than a poisson, describes count data.

CPM

Count data is not normally distributed, so if we want to examine the distributions of the raw counts we need to log the counts. Next we’ll use box plots to check the distribution of the read counts on the log2 scale. We can use the cpm function to get log2 counts per million, which are corrected for the different library sizes. The cpm function also adds a small offset (0.25) to avoid taking log of zero.

Below, a comparison between gene counts before and after log transformation and Counts per Million (to account for different library sizes). The distribution of the counts is shown as a density plot bottom right. Control, T3 , MPI , CPF , CPF+T3.


Determine filtering threshold

You should filter with CPMs rather than filtering on the counts directly, as the latter does not account for differences in library sizes between samples.

Set a CPM threshold that corresponds to a count of 10-15 for the library sizes in your data set (e.g. 0.5 for a library of around 20million). 0.5 COUNTS PER MILLION * 20millions = 10 COUNTS. If the count is any smaller, it is considered to be very low, indicating that the associated gene is not expressed in that sample.

A requirement for expression in 10 or more libraries is used as each group contains 10 replicates. This ensures that a gene will be retained if it is only expressed in one group. Smaller CPM thresholds are usually appropriate for larger libraries. As a general rule, a good threshold can be chosen by identifying the CPM that corresponds to a count of 10.

What counts as “lowly expressed” depends on library size. We will now find library sizes of each sample. First, we can check how many reads we have for each sample in the DGE object (this is automatic calculated by the DGE object).

The max library size is 12491570 : sample 73 : CPF_7_L001 
The mean library size is 10260747 
The min library size is 8154673 : sample 86 : CPF.T3IOP_3_L002 
The filtering threshold of 1.226291 has been chosen 


Filter the counts
## Now that we are satisfied with CPM threshold, we can filter the data
# Find CPM values that are greater than the threshold established above
above_threshold <- counts_CPMraw > filtering_threshold
# This produces a logical matrix with TRUEs and FALSEs

# we would like to keep genes that have at least 2 TRUES in each row of "above_threshold"
keep <- rowSums(above_threshold) >= 10 # 10 because we have 10 biological replicates per condition (each with 2 lanes)
summary(keep)
   Mode   FALSE    TRUE 
logical    5351   21538 


Replot after filtering

Normalisation for composition bias

TMM normalisation

TMM normalization is performed to eliminate composition biases between libraries (Mark D. Robinson and Oshlack 2010). This generates a set of normalization factors, where the product of these factors and the library sizes defines the effective library size. The calcNormFactors function calculates the normalization factors between libraries. TMM normalisation (and most scaling normalisation methods) scale relative to one sample.

The normalization factors multiply to unity across all libraries. A normalization factor below one indicates that the library size will be scaled down, as there is more suppression (i.e., composition bias) in that library relative to the other libraries. This is also equivalent to scaling the counts upwards in that sample. Conversely, a factor above one scales up the library size and is equivalent to downscaling the counts.

Plotting mean-difference plots of the samples with biggest and with smallest normalisation factors, we should be able to see the composition bias problem. We will use the logcounts, which have been normalised for library size, but not for composition bias.

The mean-difference plots show average expression (mean: x-axis) against log-fold-changes (difference: y-axis). If we redo these plots using the TMM-normalised counts (normalisation factors are stored in the DGE object), we should see the composition bias problem has been solved.

In the sample with biggest norm.factor ( CPF.T3IOP_6_L002 ) the median expression ratio compared to other samples went from 1.050764 to 0.9746659 after TMM normalisation 
 
In the sample with smallest norm.factor ( DMSO_4_L002 ) the median expression ratio compared to other samples went from 0.8131295 to 0.9888561 after TMM normalisation 

Deseq2

DESeq2 internally corrects counts for sequencing depth (i.e. what we did by using CPM) and RNA compositional bias (norm) using Median of ratios method. To run this method, we create a DESeq2 object using the count data and metadata.

converting counts to integer mode

VST

For the purpose of exploratory analysis such as MDS, PCA, clustering etc, VST (variance-stabilizing-transformation) is recommended. VST is also run using DESeq2. As in the previous step, a DESeq2 object is created. Variance stabilizing transformation (VST) aims at generating a matrix of values for which variance is constant across the range of mean values, especially for low mean.The vst function computes the fitted dispersion-mean relation, derives the transformation to apply and accounts for library size.

For RNA-seq data, as the mean count value increases, the variance increases. There is a strong almost linear relationship as seen in the figures. The statistical methods such as PCA expects similar variance across the range of mean values. If not, the higher variance genes will contribute more than the lower variance genes. Such data is said to be heteroscedastic and needs to be corrected. Correction using log transformation (with pseudocount) gives inflates the contribution of the low variance genes. To obtain similar variance across the whole range of mean values, DESeq2 offers two methods VST (variance stabilising transformation) and RLOG (regularised log transformation).

As the name suggests, VST transformation stabilizes variance across the whole range of count values. VST is recommended for clustering or visualisation. It is not intended for differential gene expression. If the size factors vary dramatically between samples, then RLOG transformation is recommended.


Below, an overview of the main dataset properties across objects

gene-wise dispersion estimates
mean-dispersion relationship
final dispersion estimates

Overview analysis of the dataset

Overview analysis of the dataset (top variable genes)

🔎 To get a first impression of the dataset, we will calculate exploratory PCAs on all most variable genes in the dataset, regardless of the biological processes in which they are involved. What genes separate A. ocellaris larvae across the dataset?


* Step 1: For PCA and visualisation, we will use the VST transformed object (DeSeq2 object with Variance Stabilising Transformation applied, see previous section): Below, an overview of the main count features of this starting object


* Step 2a: We now can subset our counts matrix, to just keep the most variable genes. This threshold could be chosen arbitrarily based either on number of genes (i.e. the top2000 most variable genes), or on variance of these genes (i.e. the genes with top 10% variance). Different possible thresholds on this dataset are illustrated below:


* Step 2b: Here, we will select based on a variance threshold, but not an aribitrary one. We wukk select the genes with higest variance, based on the inflection point of the variance distribution of all genes. As per below:

[1] "The sample variance cutoff of s^2>0.21 has been selected based on the kneedle algorithm"
[1] "There are 3418 genes whose variance across all samples is above this threshold (15.87% of all genes)"


* Step 3: We can now subset our object. In this case, we are thus using 3418 genes, the most variable ones. The plots below show the summary properties of this subset (note indeed the high variance). In blue in the mean-variance plot 🔹, the genes that have been selected out of all of the genes in the original object.


  • Step 4: Incidentally, we can highlight and list the top15 genes that have highest expression (though they might not be the variant ones)

Correlation between samples (most variable genes)


Dendogram


Correlation matrix:

PCA plots

PCA plots

We can run the PCA based on the top variable genes. Below, the scree plot indicating the contribution of each Principal Component, and the plot of the PCA over the top10 components.


  • Step 1: Below, an exploratory overview of the distribution of samples across the main PCs, highlighting treatment conditions, as well as other known possible sources of variation (here: technical replicates: different lanes)


* Step 2: The scree plot shows that most of the variance present in the dataset can be represented in two dimensions. Below is the PC1 vs PC2 summary plot, coloured by condition, with and without labels to correlate points to the actual larval samples (of which we have pictures)


* Step 3: With added polygons to highlight the spread of samples within each condition (this is the final figure reported in the paper)

Top contributors PC1 (treatment (MPI vs T3, T3CPF))

We will here analyse the main genes driving separation along PC1.

Below, the biplot showing the relative influence of each of the genes


Below, a dedicated visualisation of the relative level of expression of each gene, in each sample.

Top contributors PC2 (CPF vs DMSO/T3)

We will here analyse the main genes driving separation along PC2.


Below, a dedicated visualisation of the relative level of expression of each gene, in each sample.

Explore sample distribution PC2 drivers

Top contributors PC3 (T3?)

We will here analyse the main genes driving separation along PC3.

Below, the relative expression level

Explore sample distribution PC3 drivers

Top contributors PC4 (?)

We will here analyse the main genes driving separation along PC4.

Below, the relative expression level of each gene

Top contributors PC5 (pre/post metamorphosis?)

We will here analyse the main genes driving separation along PC5.

Below, the relative expression level of each gene:

Top contributors PC6 (?)

We will here analyse the main genes driving separation along PC6

Below, the relative expression level of each gene:

Hierarchical clustering

Hierarchical clustering on the top 250 most variable genes

🔎 An alternative to PCA for examining relationships between samples is using hierarchical clustering. Heatmaps are a nice visualisation to examine hierarchical clustering of samples.

Thyroid signalling
Genes present in the dataset (retained)
entrez_ID description
111583913 iodothyronine deiodinase 1
111563633 iodothyronine deiodinase 2
111586185 iodothyronine deiodinase 3a
111573799 thyroxine 5-deiodinase-like
111588109 thyroglobulin
111577711 dual oxidase
111577709 dual oxidase 2
111576557 solute carrier family 5 member 5
111565036 selenocysteine lyase
111562581 thyroid peroxidase
111585831 solute carrier family 16 member 10
111580672 solute carrier organic anion transporter family member 1C1-like.1
111581275 solute carrier family 3 member 2a
111572371 solute carrier family 7 member 11
111575976 thyroid hormone receptor alpha.1
111566418 thyroid hormone receptor alpha
111573399 thyroid hormone receptor beta
111568343 nuclear receptor subfamily 1, group H, member 4
111588196 hepatic sodium/bile acid cotransporter-like
111569563 solute carrier family 10 member 1
111565180 hematopoietically expressed homeobox
111570790 Kruppel-like factor 9
118470383 NK2 homeobox 1.1
111573897 paired box 2a
111567846 paired box protein Pax-2a-like
111567309 paired box 8
111566720 mediator complex subunit 1
111565463 nuclear receptor coactivator 1
111587689 nuclear receptor coactivator 2
111579940 nuclear receptor coactivator 3-like.1
111575203 nuclear receptor corepressor 1
111581903 nuclear receptor corepressor 2
111571366 solute carrier family 16 member 2
111576582 solute carrier family 2, facilitated glucose transporter member 1-like.1
111580035 solute carrier family 2 member 1b

HPT only
Genes present in the dataset (retained)
entrez_ID description
111575142 corticotropin releasing hormone binding protein.1
111584834 thyrotropin-releasing hormone receptor a
111568983 thyrotropin-releasing hormone receptor b
111571736 thyrotropin-releasing hormone-degrading ectoenzyme-like.1

HPI axis
Genes present in the dataset (retained)
entrez_ID description
111575142 corticotropin releasing hormone binding protein.1
111584347 corticotropin-releasing factor receptor 1
111580118 pro-opiomelanocortin
111577563 proopiomelanocortin a
111584656 pro-opiomelanocortin.1
111571458 urocortin 3, like

Pigmentation/white bands
Genes present in the dataset (retained)
entrez_ID description
111565550 apolipoprotein Da, duplicate 1
111563999 four and a half LIM domains protein 2-like
111579034 glycoprotein (transmembrane) nmb
111582421 purine nucleoside phosphorylase 4a
111579411 uncharacterized si:ch211-256m1.8
111572570 solute carrier family 2 member 15a
111577709 dual oxidase 2
111577711 dual oxidase
111577940 ALK and LTK ligand 2b

Ossification
Genes present in the dataset (retained)
entrez_ID description
111568804 bone gamma-carboxyglutamate (gla) protein
111586092 calumenin a
111588590 collagen, type I, alpha 1a
111579186 collagen, type I, alpha 1b
111573347 collagen, type I, alpha 2
111566038 periostin
111563675 periostin, osteoblast specific factor b
111583782 Sp7 transcription factor
111573268 collagen, type X, alpha 1a
111580793 secreted phosphoprotein 2
111564978 upper zone of growth plate and cartilage matrix associated a

Vision/opsins
Genes present in the dataset (retained)
entrez_ID description
111579646 arrestin 3b, retinal (X-arrestin)
111581093 cyclic nucleotide gated channel subunit alpha 3a
111584765 guanine nucleotide binding protein (G protein), alpha transducing activity polypeptide 1
111584041 guanylate cyclase activator 1A
111580086 phosphodiesterase 6A, cGMP-specific, rod, alpha
111581810 retinal cone rhodopsin-sensitive cGMP 3’,5’-cyclic phosphodiesterase subunit gamma-like.4
111575698 sodium/potassium/calcium exchanger 2-like.1

NMJ genes
Genes present in the dataset (retained)
entrez_ID description
111566251 high affinity choline transporter 1-like
111566253 high-affinity choline transporter 1-like.1
111577330 high-affinity choline transporter 1-like.3
111583962 high-affinity choline transporter 1-like.5
111581877 cholinergic receptor, nicotinic, alpha 1 (muscle)
111567659 cholinergic receptor, nicotinic, gamma
111588831 collagen-like tail subunit (single strand of homotrimer) of asymmetric acetylcholinesterase

Cholesterol
Genes present in the dataset (retained)
entrez_ID description
111564800 acetoacetyl-CoA synthetase
111570356 3-hydroxy-3-methylglutaryl-CoA synthase 1 (soluble)
111579328 3-hydroxy-3-methylglutaryl-coenzyme A reductase-like.1
111568310 mevalonate kinase
111577166 mevalonate (diphospho) decarboxylase a
111565278 isopentenyl-diphosphate delta isomerase 1
111571978 farnesyl diphosphate synthase (farnesyl pyrophosphate synthetase, dimethylallyltranstransferase, geranyltranstransferase)
111569937 farnesyl-diphosphate farnesyltransferase 1
111562938 squalene epoxidase a
111582860 lanosterol synthase (2,3-oxidosqualene-lanosterol cyclase)
111581125 24-dehydrocholesterol reductase
111565075 lanosterol 14-alpha demethylase
111574709 methylsterol monooxygenase 1
111565582 NAD(P) dependent steroid dehydrogenase-like
111574572 ergosterol biosynthesis 28 homolog
111580686 EBP cholestenol delta-isomerase
111584459 EBP like
111573906 stearoyl-CoA desaturase b
111583785 sterol O-acyltransferase 2
111568530 cholesterol 25-hydroxylase
111563276 vitamin D 25-hydroxylase
111587639 25-hydroxyvitamin D-1 alpha hydroxylase, mitochondrial
111579624 1,25-dihydroxyvitamin D(3) 24-hydroxylase, mitochondrial
111565886 vitamin D3 receptor B

Steroidogenesis
Genes present in the dataset (retained)
entrez_ID description
111570570 hydroxy-delta-5-steroid dehydrogenase, 3 beta- and steroid delta-isomerase 1
111575402 progesterone receptor
111567954 hydroxysteroid (11-beta) dehydrogenase 2
111565142 nuclear receptor subfamily 3, group C, member 1 (glucocorticoid receptor)
111574492 glucocorticoid receptor
111576668 hydroxysteroid (17-beta) dehydrogenase 3
111572734 hydroxysteroid (17-beta) dehydrogenase 14
111569843 steroid-5-alpha-reductase, alpha polypeptide 1 (3-oxo-5 alpha-steroid delta 4-dehydrogenase alpha 1)
111587360 androgen receptor
111565746 aromatase
111588998 estrogen receptor 2a

Bile acids
Genes present in the dataset (retained)
entrez_ID description
111576985 cytochrome P450 7A1
111568649 5-beta-cholestane-3-alpha,7-alpha-diol 12-alpha-hydroxylase-like
111568654 5-beta-cholestane-3-alpha,7-alpha-diol 12-alpha-hydroxylase-like.1
111573167 aldo-keto reductase family 1 member D1-like
111568532 sterol 26-hydroxylase, mitochondrial.1
111563882 uncharacterized LOC111563882
111577715 hsFATP2a_ACSVL_like domain-containing protein
111564846 alpha-methylacyl-CoA racemase
111564685 hydroxysteroid (17-beta) dehydrogenase 4
111587618 sterol carrier protein 2a
111576150 sterol carrier protein 2b
111569566 acyl-CoA thioesterase 20
111572824 ATP-binding cassette, sub-family B (MDR/TAP), member 11a

Cholesterol regulation and transport
Genes present in the dataset (retained)
entrez_ID description
111580133 uncharacterized protein C7orf50 homolog
111567927 G protein-coupled receptor 146
111578189 sterol regulatory element binding transcription factor 1
111583833 sterol regulatory element binding transcription factor 2
111581423 ER lipid raft associated 1
111588229 ER lipid raft associated 2
111571031 nuclear receptor subfamily 1, group H, member 3
111579104 antifreeze protein type IV
111574547 apolipoprotein A-Ib
118469590 apolipoprotein A-II
111562603 apolipoprotein A-IV a
111562606 apolipoprotein A-IV-like
111588528 apolipoprotein A-IV-like.1
111575002 phospholipid-transporting ATPase ABCA1-like.1
111570931 ATP-binding cassette, sub-family A (ABC1), member 1B
111565691 phospholipid-transporting ATPase ABCA1-like
111580395 scavenger receptor class B, member 2a
111583031 scavenger receptor class B, member 2c
111572688 NPC intracellular cholesterol transporter 2
111588691 ATP-binding cassette, sub-family G (WHITE), member 1
111580988 lecithin-cholesterol acyltransferase
111578413 lipase, hepatic a
111568009 low density lipoprotein receptor-related protein 1Ab
111575117 low density lipoprotein receptor-related protein 1Bb
111587369 low-density lipoprotein receptor-related protein 1-like
111564477 syndecan 4
111586529 syndecan-4-like
111569004 cholesteryl ester transfer protein, plasma
111574222 acetyl-CoA acetyltransferase 2
111563899 sterol O-acyltransferase 1
111583785 sterol O-acyltransferase 2
111575319 microsomal triglyceride transfer protein
111586299 apolipoprotein Ba
111566432 apolipoprotein Bb, tandem duplicate 1
111588529 apolipoprotein C-II
111562605 apolipoprotein Ea
111588526 apolipoprotein Eb
111566387 low density lipoprotein receptor a
111567577 myosin regulatory light chain interacting protein a
111581127 proprotein convertase subtilisin/kexin type 9
111573603 Niemann-Pick disease, type C1
111572824 ATP-binding cassette, sub-family B (MDR/TAP), member 11a
111585084 lipoprotein lipase a
111586568 lipoprotein lipase
111567821 lipase, endothelial
111571946 lipase maturation factor 2a

Liver function
Genes present in the dataset (retained)
entrez_ID description
111580890 alpha-2-macroglobulin-like
111580892 alpha-2-macroglobulin-like.1
111580894 alpha-2-macroglobulin-like.2
111580895 alpha-2-macroglobulin-like.3
111578413 lipase, hepatic a
111578802 transferrin-a
111565453 plasminogen
111582600 ceruloplasmin
111584065 complement C3
111583320 coagulation factor IX
111570235 selenoprotein P2
111568029 serpin peptidase inhibitor, clade F (alpha-2 antiplasmin, pigment epithelium derived factor), member 2a

Oxidative
Genes present in the dataset (retained)
entrez_ID description
111578837 catalase
111575864 superoxide dismutase 1, soluble
111574223 superoxide dismutase 2, mitochondrial
111575331 extracellular superoxide dismutase [Cu-Zn]
111575353 copper chaperone for superoxide dismutase
111577687 glutathione peroxidase 3
111563473 glutathione peroxidase 4a
111571007 phospholipid hydroperoxide glutathione peroxidase-like
111582504 glutathione peroxidase 7
111580757 glutathione peroxidase 8 (putative)
111567860 glutathione peroxidase 9
111569366 NAD(P)H dehydrogenase, quinone 1
111575507 heme oxygenase 1a
111584778 heme oxygenase-like
111569915 heme oxygenase 2a
111567707 heme oxygenase 2b
111565959 UDP-glucuronosyltransferase 1-2-like
111568569 UDP glycosyltransferase 8
111571828 UDP-glucuronosyltransferase-like
111580426 UDP glucuronosyltransferase 2 family, polypeptide B3
111566481 glutamate-cysteine ligase, catalytic subunit
111586211 biliverdin reductase B
111570618 glutamate-cysteine ligase, modifier subunit
111573235 epoxide hydrolase 2, cytoplasmic
111572235 epoxide hydrolase 4
111585235 epoxide hydrolase 5
111572118 sulfiredoxin 1 homolog (S. cerevisiae)
111572824 ATP-binding cassette, sub-family B (MDR/TAP), member 11a
111562997 liver carboxylesterase 1-like
111569059 carboxylesterase 3
111577847 nfe2 like bZIP transcription factor 2a
111570165 kelch-like ECH-associated protein 1b

Immunity
Genes present in the dataset (retained)
entrez_ID description
111563068 C-X-C motif chemokine 13-like
111569545 C-X-C motif chemokine 3-like
111562955 chemokine (C-X-C motif) receptor 3, tandem duplicate 1
111577429 C-X-C motif chemokine 5-like
111586938 cyclic GMP-AMP synthase a
111563935 cyclic GMP-AMP synthase
111584798 DEXH (Asp-Glu-X-His) box polypeptide 58
111567610 stimulator of interferon response cGAMP interactor 1
111576250 zinc finger, NFX1-type containing 1
111573712 eukaryotic translation initiation factor 2-alpha kinase 2
111573734 interferon-induced, double-stranded RNA-activated protein kinase-like.1
111588694 cytidine monophosphate (UMP-CMP) kinase 2, mitochondrial
111588695 radical S-adenosyl methionine domain containing 2
111562645 cytosolic 5’-nucleotidase 1A-like
111584600 interferon regulatory factor 3
111574762 interferon-induced GTP-binding protein Mx
111574765 interferon-induced GTP-binding protein Mx-like
111585454 interferon-induced protein with tetratricopeptide repeats 5-like
129347476 interferon-induced protein with tetratricopeptide repeats 5-like.1
111562649 interferon alpha-inducible protein 27-like protein 2A
111577915 interferon alpha-inducible protein 27-like protein 2A.2
111588558 ISG15 ubiquitin like modifier
111584047 ubiquitin specific peptidase 18
111582159 E3 ubiquitin-protein ligase NEURL3
118471831 interferon gamma 1
111572427 signal transducer and activator of transcription 1a
111566617 signal transducer and activator of transcription 2

DNA_repair
Genes present in the dataset (retained)
entrez_ID description
111571778 E2F transcription factor 1
111563434 ATR serine/threonine kinase
111580652 checkpoint kinase 1
111564411 cyclin B2
111576335 WEE1 G2 checkpoint kinase
111579731 cyclin-dependent kinase 2
111578176 cyclin A2
111574031 cyclin E1
111582432 cyclin E2
111569251 G1/S-specific cyclin-E2-like
111576022 DNA repair protein XRCC4-like
111568731 FA complementation group A
111585542 FA complementation group B
111576667 FA complementation group C
111566993 FA complementation group E
111584863 FA complementation group G
111563082 FA complementation group I
111567306 BRCA1 DNA repair associated
111587086 retinoblastoma binding protein 8
111572887 BRCA1 associated RING domain 1
111566265 partner and localizer of BRCA2
111581756 RAD52 motif containing 1
111588143 RAD52 homolog, DNA repair protein
111579911 centromere protein S
111577714 FANCD2 and FANCI associated nuclease 1
111581512 nei-like DNA glycosylase 3
111588554 uracil DNA glycosylase a
111588339 APEX nuclease (apurinic/apyrimidinic endonuclease) 2
111574625 ligase I, DNA, ATP-dependent
111571989 flap structure-specific endonuclease 1
111587039 ETAA1 activator of ATR kinase a
111569726 replication protein A1
111563381 replication protein A2
111577896 mutS homolog 2 (E. coli)
111586691 exonuclease 1

UP T3 and CPF (selected)
Genes present in the dataset (retained)
entrez_ID description
111565606 C-C motif chemokine 21-like
111565785 interferon-induced protein 44-like
111569545 C-X-C motif chemokine 3-like
111565603 C-C motif chemokine 19-like
129350609 receptor-transporting protein 3-like.1
111566617 signal transducer and activator of transcription 2
111584583 transporter associated with antigen processing, subunit type a
111562713 XIAP associated factor 1
111571519 protein mono-ADP-ribosyltransferase PARP11.1
111584589 H-2 class I histocompatibility antigen, Q9 alpha chain
111569157 suppressor of cytokine signaling 1-like
111586660 sorting nexin 20
111574043 interferon-induced protein 44-like.2
111588744 interferon regulatory factor 10

DOWN CPF and MPI (selected)
Genes present in the dataset (retained)
entrez_ID description
111574818 hemoglobin embryonic subunit alpha-like.1
111582400 hemoglobin beta embryonic-2
111570155 myoglobin
111585684 anterior gradient 2
111581053 proproteinase E-like
111582409 aquaporin 8a, tandem duplicate 2
111579739 acidic mammalian chitinase-like.4

DOWN CPF and T3 (selected)
Genes present in the dataset (retained)
entrez_ID description
111574812 hemoglobin embryonic subunit alpha-like
111574813 hemoglobin embryonic subunit alpha.1
111574814 hemoglobin subunit beta-like.2
111574811 hemoglobin embryonic subunit alpha
111566442 apolipoprotein B-100-like.1
111566432 apolipoprotein Bb, tandem duplicate 1
111564925 fatty acid synthase
111570821 acyl-CoA synthetase short chain family member 2 like
111566479 ELOVL fatty acid elongase 5
111588379 ELOVL fatty acid elongase 6
111571760 acetyl-CoA carboxylase alpha
111564800 acetoacetyl-CoA synthetase

Differential Expression Analysis

Differential gene expression analysis

🔎 For differential expression , gene expression is rarely considered at the level of raw counts since libraries sequenced at a greater depth will result in higher counts. Rather, it is common practice to transform raw counts onto a scale that accounts for such library size differences. Popular transformations include counts per million (CPM), log2-counts per million (log-CPM), reads per kilobase of transcript per million (RPKM), and fragments per kilobase of transcript per million (FPKM). Here raw counts are converted log-CPM values using the voom function in limma package.


What is voom doing? Counts are transformed to log2 counts per million reads (CPM), where “per million reads” is defined based on the normalization factors we calculated earlier A linear model is fitted to the log2 CPM for each gene, and the residuals are calculated A smoothed curve is fitted to the sqrt(residual standard deviation) by average expression (see red line in plot above) The smoothed curve is used to obtain weights for each gene and sample that are passed into limma along with the log2 CPMs.


* Step 2: We can now process our original (filtered, TMM-normalised) object through the voom-limma pipeline, which will normalised it by library size by calculating logCPM and using the normalisation factors provided, and then fit a linear model through it:

Notice how I could not quite reproduce the limma-lmFit calculated sigma values. (compare with manually generated ones in plot just next to it). Will need to figure out the details of the limma sigma calculation.

          treatmentCPF treatmentCPF.T3IOP treatmentDMSO treatmentMPI treatmentT3IOP
111562382     4.597323           4.588862      4.293602     4.433082       4.687885
111562384     3.716782           3.602682      3.123277     3.430930       3.273383
111562387     5.126211           5.252706      5.210131     5.123160       5.278484
111562388     4.024122           3.740996      3.638425     3.674899       3.499010
111562389     3.383426           3.445715      3.510595     3.557256       3.479879
111562390     5.587841           5.711669      5.863940     5.750005       5.616157
effect of CPF (CPF vs DMSO)
                    Contrasts
Levels               treatmentCPF - treatmentDMSO
  treatmentCPF                                  1
  treatmentCPF.T3IOP                            0
  treatmentDMSO                                -1
  treatmentMPI                                  0
  treatmentT3IOP                                0


Below, a list of all the genes that appear significantly differently expressed between treatment and control (in either direction; Table 1). In Table 2, the subest of significantly changing genes whose fold-change is bigger than 2folds (in either direction). These genes are ranked in order of decreasing fold change.

[1] "1477 differentially expressed genes (P <0.05, FC<1/2 OR FC>2):"
[1] "715 genes upregulated by CPF"
[1] "762 genes downregulated by CPF"

Over-representation Analysis:

🔎 Can we get some broad ideas of the families of genes represented by the genes we have found to be differentially expressed? In our ranked list of Differentially Expressed genes, are some pathways/biological processes over-represented? We will use the clusterProfileR/enricheR packages for a first analysis.


* Top over-represented Gene Ontology gene sets (ordered by adjusted p.value, descending):

Scale for fill is already present.
Adding another scale for fill, which will replace the existing scale.


* … and genes associated with it (notice the overlaps of genes belonging to multiple sets):


* Relationship between the Gene sets identified:

Warning: Use 'cex.params = list(category_node = your_value)' instead of 'cex_category'.
 The cex_category parameter will be removed in the next version.Warning: Use 'cex.params = list(category_label = your_value)' instead of 'cex_label_category'.
 The cex_label_category parameter will be removed in the next version.Warning: Use 'cex.params = list(line = your_value)' instead of 'cex_line'.
 The cex_line parameter will be removed in the next version.


* Quantification of the overlap between genes in each set:

Warning: `aes_()` was deprecated in ggplot2 3.0.0.
Please use tidy evaluation idioms with `aes()`


Below, a list of the pathway identified by Gene Enrichment Analysis, and the genes in our differential-expression list that belong to each:

Gene Set Enrichment analysis:

🔎 Complementarily, we can perform Gene Set Enrichment Analysis (GSE), not on just the genes we have found to be truly Differentially Expressed (i.e. significant, fold change above a given threshold), but on all genes found to differ between the two timepoints. GSE will look for genes showing significantly co-ordinated shifts in expression across the timepoints, regardless of their magnitude, and indicate the Gene Ontology family to which they most belong.

Genes of GO set:[regulation of DNA-templated transcription] present amonst genes of interest
FC adj.P.Val ensembl_ID merged_description AveExpr CI.L CI.R
85 7.078257 0.0000000 ENSAOCG00000011966 interferon regulatory factor 7 4.1135866 2.0489941 3.5977941
120 5.754260 0.0000000 ENSAOCG00000006804 interferon regulatory factor 10 2.0014121 1.3915907 3.6576699
262 3.854722 0.0000000 ENSAOCG00000009800 c-Myc-binding protein-like 0.8264786 1.0624104 2.8308431
307 3.541154 0.0000006 ENSAOCG00000001429 HMG box-containing protein 1-like 3.0884039 0.8723342 2.7761048
315 3.492513 0.0000862 ENSAOCG00000016636 cAMP-responsive element modulator-like -0.4351943 0.5776825 3.0308485
418 -3.117339 0.0000000 ENSAOCG00000016021 E2F transcription factor 8 3.9912401 -2.0957846 -1.1848456
440 -3.060661 0.0000000 ENSAOCG00000015259 E2F transcription factor 7 2.9108956 -2.0877202 -1.1399665
568 2.790445 0.0000000 ENSAOCG00000004648 interferon regulatory factor 8 2.8819942 0.8378111 2.1231795
746 2.536091 0.0000000 ENSAOCG00000006661 forkhead box D3 2.8712268 0.8501477 1.8350648
884 2.388997 0.0000015 ENSAOCG00000010889 HMG-box transcription factor 1 5.1284569 0.5707727 1.9420380
1008 2.294870 0.0016737 ENSAOCG00000011299 vitamin D3 receptor B 2.7471716 0.1727746 2.2240507
1043 2.271704 0.0000000 ENSAOCG00000013898 transcription factor EB 4.5670032 0.7845373 1.5830122
1109 -2.231082 0.0000000 ENSAOCG00000012367 forkhead box M1 2.6648268 -1.5758511 -0.7396363
1129 -2.220877 0.0000000 ENSAOCG00000016070 E2F transcription factor 2 2.7464877 -1.5784350 -0.7238244
1146 2.206853 0.0000000 ENSAOCG00000014976 activating transcription factor 3 4.7983858 0.6616465 1.6223343
1151 -2.203311 0.0000000 ENSAOCG00000000956 E2F transcription factor 1 3.3531519 -1.6511179 -0.6282281
1445 2.049281 0.0000000 ENSAOCG00000009059 cAMP-responsive element modulator-like.1 4.9011754 0.6498377 1.4203973
1486 2.029369 0.0001288 ENSAOCG00000002749 transcription factor HES-1-like 0.7599566 0.3082510 1.7338117
Genes of GO set:[signal transduction] present amonst genes of interest
FC adj.P.Val ensembl_ID merged_description AveExpr CI.L CI.R
15 31.193419 0.0000000 ENSAOCG00000021849 C-C motif chemokine 21-like 3.9229597 3.1647198 6.7616198
43 10.857986 0.0000000 ENSAOCG00000021807 C-C motif chemokine 19-like 2.6373316 1.8801146 5.0012546
140 5.237432 0.0000006 ENSAOCG00000021393 fibroblast growth factor 19 0.5031300 1.1402542 3.6374652
161 4.834595 0.0000000 ENSAOCG00000000350 C-X-C motif chemokine 3-like 0.1732039 1.2774156 3.2693747
328 3.420514 0.0000000 ENSAOCG00000002726 insulin receptor substrate 2-like 6.1365065 1.1646180 2.3838084
365 3.284270 0.0000306 ENSAOCG00000017689 interleukin-1 beta-like 2.6769081 0.6215557 2.8095896
527 -2.877372 0.0000000 ENSAOCG00000001825 urotensin-2-like 1.7290122 -2.1252227 -0.9242804
616 2.722411 0.0000000 ENSAOCG00000016852 fibroblast growth factor 7 1.9933149 0.9771695 1.9126004
624 2.713739 0.0007007 ENSAOCG00000006664 C-X-C motif chemokine 13-like -1.4880440 0.2988652 2.5816988
698 2.588272 0.0000002 ENSAOCG00000005792 chemerin-like receptor 1 0.7048903 0.6874396 2.0565394
944 -2.349010 0.0000090 ENSAOCG00000001578 parathyroid hormone-related protein-like -0.2685769 -1.9660141 -0.4980916
952 2.340531 0.0000000 ENSAOCG00000017457 neurotensin 1.1032705 0.6574539 1.7962181
1147 -2.206435 0.0000000 ENSAOCG00000021414 fibroblast growth factor 4 1.1640865 -1.5851199 -0.6983148
1205 2.172111 0.0000000 ENSAOCG00000013198 cellular communication network factor 5 2.8327025 0.6817869 1.5564084
1277 2.127529 0.0010447 ENSAOCG00000005622 interleukin-8-like 2.7417705 0.1960192 1.9823386
Genes of GO set:[cell chemotaxis] present amonst genes of interest
FC adj.P.Val ensembl_ID merged_description AveExpr CI.L CI.R
15 31.193419 0.0000000 ENSAOCG00000021849 C-C motif chemokine 21-like 3.9229597 3.1647198 6.761620
43 10.857986 0.0000000 ENSAOCG00000021807 C-C motif chemokine 19-like 2.6373316 1.8801146 5.001255
161 4.834595 0.0000000 ENSAOCG00000000350 C-X-C motif chemokine 3-like 0.1732039 1.2774156 3.269375
624 2.713739 0.0007007 ENSAOCG00000006664 C-X-C motif chemokine 13-like -1.4880440 0.2988652 2.581699
1277 2.127529 0.0010447 ENSAOCG00000005622 interleukin-8-like 2.7417705 0.1960192 1.982339
Genes of GO set:[immune response] present amonst genes of interest
FC adj.P.Val ensembl_ID merged_description AveExpr CI.L CI.R
15 31.193419 0.0000000 ENSAOCG00000021849 C-C motif chemokine 21-like 3.9229597 3.1647198 6.761620
43 10.857986 0.0000000 ENSAOCG00000021807 C-C motif chemokine 19-like 2.6373316 1.8801146 5.001255
161 4.834595 0.0000000 ENSAOCG00000000350 C-X-C motif chemokine 3-like 0.1732039 1.2774156 3.269375
365 3.284270 0.0000306 ENSAOCG00000017689 interleukin-1 beta-like 2.6769081 0.6215557 2.809590
624 2.713739 0.0007007 ENSAOCG00000006664 C-X-C motif chemokine 13-like -1.4880440 0.2988652 2.581699
1277 2.127529 0.0010447 ENSAOCG00000005622 interleukin-8-like 2.7417705 0.1960192 1.982339
Genes of GO set:[innate immune response] present amonst genes of interest
FC adj.P.Val ensembl_ID merged_description AveExpr CI.L CI.R
2 106.108271 0.0001077 ENSAOCG00000009483 radical S-adenosyl methionine domain containing 2 0.7886398 2.0874194 11.371367
198 4.398012 0.0000000 ENSAOCG00000014773 interferon induced with helicase C domain 1 4.5326141 1.3361004 2.937603
490 2.954210 0.0000000 ENSAOCG00000014324 stimulator of interferon response cGAMP interactor 1 4.7936445 1.1099843 2.015561
749 2.533225 0.0000000 ENSAOCG00000003018 BPI fold containing family C, like 3.4556548 0.8807504 1.801201
Genes of GO set:[protein ubiquitination] present amonst genes of interest
FC adj.P.Val ensembl_ID merged_description AveExpr CI.L CI.R
42 11.208823 0.0000141 ENSAOCG00000001507 F-box protein 32 3.685539 1.3591410 5.6139848
290 3.623111 0.0000000 ENSAOCG00000021490 probable E3 ubiquitin-protein ligase RNF144A-A 2.561224 1.1396744 2.5747837
364 3.288402 0.0000000 ENSAOCG00000003430 ankyrin repeat and SOCS box protein 5-like 3.874505 1.1363472 2.2984258
421 3.110220 0.0009412 ENSAOCG00000021104 ankyrin repeat and SOCS box containing 10 1.666977 0.3069065 2.9671270
443 3.056145 0.0000002 ENSAOCG00000009597 uncharacterized LOC111578154 1.780247 0.8114182 2.4120082
889 2.386079 0.0000000 ENSAOCG00000009911 F-box protein 25 1.852955 0.6994113 1.8098728
1222 2.165001 0.0000000 ENSAOCG00000014883 suppressor of cytokine signaling 3-like 5.249281 0.7054199 1.5233148
1239 -2.153274 0.0000000 ENSAOCG00000020444 pre-mRNA processing factor 19 5.726295 -1.4976596 -0.7154035
Genes of GO set:[immune system process] present amonst genes of interest
FC adj.P.Val ensembl_ID merged_description AveExpr CI.L CI.R
2 106.108271 0.0001077 ENSAOCG00000009483 radical S-adenosyl methionine domain containing 2 0.7886398 2.0874194 11.371367
198 4.398012 0.0000000 ENSAOCG00000014773 interferon induced with helicase C domain 1 4.5326141 1.3361004 2.937603
749 2.533225 0.0000000 ENSAOCG00000003018 BPI fold containing family C, like 3.4556548 0.8807504 1.801201
Genes of GO set:[intracellular signal transduction] present amonst genes of interest
FC adj.P.Val ensembl_ID merged_description AveExpr CI.L CI.R
364 3.288402 0.0000000 ENSAOCG00000003430 ankyrin repeat and SOCS box protein 5-like 3.874505 1.1363472 2.298426
421 3.110220 0.0009412 ENSAOCG00000021104 ankyrin repeat and SOCS box containing 10 1.666977 0.3069065 2.967127
1222 2.165001 0.0000000 ENSAOCG00000014883 suppressor of cytokine signaling 3-like 5.249281 0.7054199 1.523315
Genes of GO set:[positive regulation of DNA-templated transcription] present amonst genes of interest
FC adj.P.Val ensembl_ID merged_description AveExpr CI.L CI.R
85 7.078257 0 ENSAOCG00000011966 interferon regulatory factor 7 4.1135866 2.0489941 3.597794
120 5.754260 0 ENSAOCG00000006804 interferon regulatory factor 10 2.0014121 1.3915907 3.657670
262 3.854722 0 ENSAOCG00000009800 c-Myc-binding protein-like 0.8264786 1.0624104 2.830843
568 2.790445 0 ENSAOCG00000004648 interferon regulatory factor 8 2.8819942 0.8378111 2.123179
Genes of GO set:[inflammatory response] present amonst genes of interest
FC adj.P.Val ensembl_ID merged_description AveExpr CI.L CI.R
365 3.28427 3.06e-05 ENSAOCG00000017689 interleukin-1 beta-like 2.676908 0.6215557 2.80959
MGSA analysis (Model-based Gene Set Analysis:

An alternative analysis of gene-set enrichment is Model-based Gene Set Analysis, which tries to find the most conservative set of Gene Ontology gene sets that covers the genes submitted for analysis (in this case, the differentially expressed genes). In theory, the resulting Gene Sets will be less redundant than previous approaches.


The Gene sets with highest probability of activation are:


Below, for reference, the scoring of all Gene Ontology gene sets considered, and the hyperparameters of the model ( alpha , beta, and indirectly p ):


For the top scoring pathways, below the list of the actual genes belonging to that pathway that were found in our list of differentially-expressed genes:

Competitive Gene Set Tests (MRGSE)
GO gene sets identified by the Mean-Rank Gene Set Enrichment tests (MRGSE) method, ranked by adjusted p.value
p.value id database description adjusted_pvalue
662 0.0000190 GO:0006270 GO DNA replication initiation 0.0000153
153 0.0002441 GO:0051603 GO proteolysis involved in protein catabolic process 0.0000305
451 0.0004972 GO:0051225 GO spindle assembly 0.0000458
127 0.0006862 GO:0006261 GO DNA-templated DNA replication 0.0000610
1420 0.0016776 GO:0036297 GO interstrand cross-link repair 0.0000763
1565 0.0031825 GO:0030261 GO chromosome condensation 0.0000915
1776 0.0058595 GO:0051382 GO kinetochore assembly 0.0001068
855 0.0060320 GO:0051321 GO meiotic cell cycle 0.0001221
2034 0.0061692 GO:0009157 GO deoxyribonucleoside monophosphate biosynthetic process 0.0001373
102 0.0068306 GO:0010906 GO regulation of glucose metabolic process 0.0001526
658 0.0072105 GO:0009615 GO response to virus 0.0001678
480 0.0087610 GO:0015671 GO oxygen transport 0.0001831
2445 0.0090578 GO:0031297 GO replication fork processing 0.0001984
1067 0.0096332 GO:0032446 GO protein modification by small protein conjugation 0.0002136
126 0.0121840 GO:0006269 GO DNA replication, synthesis of RNA primer 0.0002289
1485 0.0124179 GO:0002573 GO myeloid leukocyte differentiation 0.0002441
1090 0.0138946 GO:0000070 GO mitotic sister chromatid segregation 0.0002594
730 0.0145327 GO:0006569 GO tryptophan catabolic process 0.0002746
837 0.0147286 GO:0051276 GO chromosome organization 0.0002899
1342 0.0149019 GO:0006207 GO ‘de novo’ pyrimidine nucleobase biosynthetic process 0.0003052
1178 0.0151171 GO:0006621 GO protein retention in ER lumen 0.0003204
2656 0.0161531 GO:0001837 GO epithelial to mesenchymal transition 0.0003357
1450 0.0165842 GO:0019287 GO isopentenyl diphosphate biosynthetic process, mevalonate pathway 0.0003509
1767 0.0167932 GO:0007076 GO mitotic chromosome condensation 0.0003662
1195 0.0168562 GO:0008630 GO intrinsic apoptotic signaling pathway in response to DNA damage 0.0003814
2290 0.0174160 GO:0006839 GO mitochondrial transport 0.0003967
317 0.0190975 GO:0000387 GO spliceosomal snRNP assembly 0.0004120
2260 0.0202995 GO:0036066 GO protein O-linked fucosylation 0.0004272
2206 0.0208556 GO:0098542 GO defense response to other organism 0.0004425
729 0.0219236 GO:0019441 GO tryptophan catabolic process to kynurenine 0.0004577

We can do the same with KEGG pathways

KEGG gene sets identified by the Mean-Rank Gene Set Enrichment tests (MRGSE) method, ranked by adjusted p.value
p.value id database description adjusted_pvalue index
15 0.0000000 aoce00190 KEGG Oxidative phosphorylation - Amphiprion ocellaris (clown anemonefish) 0.0002890 1
86 0.0000000 aoce01100 KEGG Metabolic pathways - Amphiprion ocellaris (clown anemonefish) 0.0005780 2
124 0.0000000 aoce04110 KEGG Cell cycle - Amphiprion ocellaris (clown anemonefish) 0.0008671 3
102 0.0000000 aoce03030 KEGG DNA replication - Amphiprion ocellaris (clown anemonefish) 0.0011561 4
104 0.0000000 aoce03050 KEGG Proteasome - Amphiprion ocellaris (clown anemonefish) 0.0014451 5
103 0.0000000 aoce03040 KEGG Spliceosome - Amphiprion ocellaris (clown anemonefish) 0.0017341 6
113 0.0000000 aoce03430 KEGG Mismatch repair - Amphiprion ocellaris (clown anemonefish) 0.0020231 7
116 0.0000000 aoce03460 KEGG Fanconi anemia pathway - Amphiprion ocellaris (clown anemonefish) 0.0023121 8
114 0.0000001 aoce03440 KEGG Homologous recombination - Amphiprion ocellaris (clown anemonefish) 0.0026012 9
64 0.0000005 aoce00630 KEGG Glyoxylate and dicarboxylate metabolism - Amphiprion ocellaris (clown anemonefish) 0.0028902 10
11 0.0000005 aoce00100 KEGG Steroid biosynthesis - Amphiprion ocellaris (clown anemonefish) 0.0031792 11
84 0.0000008 aoce00983 KEGG Drug metabolism - other enzymes - Amphiprion ocellaris (clown anemonefish) 0.0034682 12
91 0.0000011 aoce01232 KEGG Nucleotide metabolism - Amphiprion ocellaris (clown anemonefish) 0.0037572 13
112 0.0000021 aoce03420 KEGG Nucleotide excision repair - Amphiprion ocellaris (clown anemonefish) 0.0040462 14
2 0.0000022 aoce00020 KEGG Citrate cycle (TCA cycle) - Amphiprion ocellaris (clown anemonefish) 0.0043353 15
23 0.0000035 aoce00280 KEGG Valine, leucine and isoleucine degradation - Amphiprion ocellaris (clown anemonefish) 0.0046243 16
97 0.0000037 aoce03013 KEGG Nucleocytoplasmic transport - Amphiprion ocellaris (clown anemonefish) 0.0049133 17
142 0.0000041 aoce04218 KEGG Cellular senescence - Amphiprion ocellaris (clown anemonefish) 0.0052023 18
19 0.0000078 aoce00240 KEGG Pyrimidine metabolism - Amphiprion ocellaris (clown anemonefish) 0.0054913 19
111 0.0000084 aoce03410 KEGG Base excision repair - Amphiprion ocellaris (clown anemonefish) 0.0057803 20
125 0.0000135 aoce04114 KEGG Oocyte meiosis - Amphiprion ocellaris (clown anemonefish) 0.0060694 21
87 0.0000226 aoce01200 KEGG Carbon metabolism - Amphiprion ocellaris (clown anemonefish) 0.0063584 22
131 0.0000311 aoce04137 KEGG Mitophagy - animal - Amphiprion ocellaris (clown anemonefish) 0.0066474 23
99 0.0000384 aoce03018 KEGG RNA degradation - Amphiprion ocellaris (clown anemonefish) 0.0069364 24
108 0.0000509 aoce03265 KEGG Virion - Lyssavirus - Amphiprion ocellaris (clown anemonefish) 0.0072254 25
17 0.0000747 aoce00230 KEGG Purine metabolism - Amphiprion ocellaris (clown anemonefish) 0.0075145 26
110 0.0001301 aoce03320 KEGG PPAR signaling pathway - Amphiprion ocellaris (clown anemonefish) 0.0078035 27
25 0.0001629 aoce00310 KEGG Lysine degradation - Amphiprion ocellaris (clown anemonefish) 0.0080925 28
30 0.0001814 aoce00380 KEGG Tryptophan metabolism - Amphiprion ocellaris (clown anemonefish) 0.0083815 29
143 0.0002102 aoce04260 KEGG Cardiac muscle contraction - Amphiprion ocellaris (clown anemonefish) 0.0086705 30
effect of MPI (MPI vs DMSO)
                    Contrasts
Levels               treatmentMPI - treatmentDMSO
  treatmentCPF                                  0
  treatmentCPF.T3IOP                            0
  treatmentDMSO                                -1
  treatmentMPI                                  1
  treatmentT3IOP                                0


Below, a list of all the genes that appear significantly differently expressed between treatment and control (in either direction; Table 1). In Table 2, the subest of significantly changing genes whose fold-change is bigger than 2folds (in either direction). These genes are ranked in order of decreasing fold change.

[1] "721 differentially expressed genes (P <0.05, FC<1/2 OR FC>2):"
[1] "296 genes upregulated by MPI"
[1] "425 genes downregulated by MPI"

effect of T3 (T3 vs DMSO)
                    Contrasts
Levels               treatmentT3IOP - treatmentDMSO
  treatmentCPF                                    0
  treatmentCPF.T3IOP                              0
  treatmentDMSO                                  -1
  treatmentMPI                                    0
  treatmentT3IOP                                  1


Below, a list of all the genes that appear significantly differently expressed between treatment and control (in either direction; Table 1). In Table 2, the subest of significantly changing genes whose fold-change is bigger than 2folds (in either direction). These genes are ranked in order of decreasing fold change.

[1] "803 differentially expressed genes (P <0.05, FC<1/2 OR FC>2):"
[1] "558 genes upregulated by T3_IOP"
[1] "245 genes downregulated by T3_IOP"

effect of CPF.T3 (CPFT3 vs DMSO)
                    Contrasts
Levels               treatmentCPF.T3IOP - treatmentDMSO
  treatmentCPF                                        0
  treatmentCPF.T3IOP                                  1
  treatmentDMSO                                      -1
  treatmentMPI                                        0
  treatmentT3IOP                                      0


Below, a list of all the genes that appear significantly differently expressed between treatment and control (in either direction; Table 1). In Table 2, the subest of significantly changing genes whose fold-change is bigger than 2folds (in either direction). These genes are ranked in order of decreasing fold change.

[1] "1507 differentially expressed genes (P <0.05, FC<1/2 OR FC>2):"
[1] "1075 genes upregulated by CPF+T3"
[1] "432 genes downregulated by CPF+T3"

Comparisons between differentially expressed genes

Venn intersection between CPF, T3, and MPI

Venn intersection between CPF, T3, and CPFT3IOP

Find genes in every intersection (CPF, T3IOP, MPI)

Find genes in every intersection (CPF, T3IOP, CPFT3IOP)

Comparing CPF and CPF+T3IOP

Top20 differentially expressed genes in CPFT3IOP vs control (all FC and pvalues; ranked by FC)
entrez_ID NCBI_symbol NCBI_description ensembl_ID ensembl_symbol ensembl_description merged_symbol original_merged_description merged_description logFC CI.L CI.R AveExpr t P.Value adj.P.Val B FC
129348303 129348303 LOC129348303 uncharacterized LOC129348303 NA NA NA LOC129348303 uncharacterized LOC129348303 uncharacterized LOC129348303 -10.068848 -13.977676 -6.160020 3.1991964 -5.111081 0.0000016 7.20e-06 4.9057973 -1074.05197
118470957 118470957 LOC118470957 uncharacterized LOC118470957 NA NA NA LOC118470957 uncharacterized LOC118470957 uncharacterized LOC118470957 -9.506054 -14.438282 -4.573826 1.5594816 -3.824165 0.0002294 6.81e-04 0.4087158 -727.12211
111588695 111588695 rsad2 radical S-adenosyl methionine domain containing 2 ENSAOCG00000009483 rsad2 radical S-adenosyl methionine domain containing 2 rsad2 radical S-adenosyl methionine domain containing 2 radical S-adenosyl methionine domain containing 2 8.754387 5.680109 11.828665 0.7886398 5.650177 0.0000002 9.00e-07 7.0320258 431.85001
111577915 111577915 LOC111577915 interferon alpha-inducible protein 27-like protein 2A NA NA NA LOC111577915 interferon alpha-inducible protein 27-like protein 2A interferon alpha-inducible protein 27-like protein 2A.2 8.528721 5.330104 11.727338 0.7634300 5.290554 0.0000007 3.60e-06 5.6193709 369.31839
111588653 111588653 LOC111588653 calpain-1 catalytic subunit-like NA NA NA LOC111588653 calpain-1 catalytic subunit-like calpain-1 catalytic subunit-like.5 -8.430433 -10.463852 -6.397014 3.1497123 -8.226262 0.0000000 0.00e+00 18.2424731 -344.99535
111565606 111565606 LOC111565606 C-C motif chemokine 21-like ENSAOCG00000021849 ENSAOCG00000021849 C-C motif chemokine 21-like LOC111565606_ENSAOCG00000021849 C-C motif chemokine 21-like C-C motif chemokine 21-like 7.655180 6.465892 8.844468 3.9229597 12.771674 0.0000000 0.00e+00 40.9585606 201.57603
111564448 111564448 LOC111564448 acidic mammalian chitinase-like ENSAOCG00000003252 ENSAOCG00000003252 CHIO1, chitinase O-1, chia2/9-like LOC111564448_ENSAOCG00000003252 acidic mammalian chitinase-like acidic mammalian chitinase-like.1 -7.495890 -8.258235 -6.733545 5.1246678 -19.509732 0.0000000 0.00e+00 69.4069184 -180.50438
111568546 111568546 lgals17 galectin 17 ENSAOCG00000023360 ENSAOCG00000023360 novel gene (galectin 17-like) lgals17_ENSAOCG00000023360 galectin 17 galectin 17 7.418167 6.441187 8.395147 5.3118168 15.065744 0.0000000 0.00e+00 51.8013770 171.03729
111576250 111576250 znfx1 zinc finger, NFX1-type containing 1 ENSAOCG00000021079 ZNFX1 zinc finger NFX1-type containing 1 znfx1 zinc finger, NFX1-type containing 1 zinc finger, NFX1-type containing 1 7.309194 5.711657 8.906730 2.8292284 9.078167 0.0000000 0.00e+00 22.9508086 158.59392
111571474 111571474 il4i1 interleukin 4 induced 1 ENSAOCG00000023672 ENSAOCG00000023672 L-amino-acid oxidase-like.2 il4i1_ENSAOCG00000023672 interleukin 4 induced 1 interleukin 4 induced 1 7.246212 5.296486 9.195938 1.9138440 7.374234 0.0000000 0.00e+00 14.7323110 151.81936
111576689 111576689 LOC111576689 protein translocase subunit SecA-like NA NA NA LOC111576689 protein translocase subunit SecA-like protein translocase subunit SecA-like 7.245204 4.470180 10.020229 -1.0328861 5.180400 0.0000012 5.50e-06 5.0171681 151.71337
111588557 111588557 LOC111588557 polyubiquitin-like ENSAOCG00000014693 ENSAOCG00000014693 polyubiquitin-like.1 LOC111588557_ENSAOCG00000014693 polyubiquitin-like polyubiquitin-like 7.185437 5.695307 8.675567 3.1584896 9.567721 0.0000000 0.00e+00 25.3551057 145.55668
118469095 118469095 sb:cb1081 sterile alpha motif domain-containing protein 9-like NA NA NA sb:cb1081 sterile alpha motif domain-containing protein 9-like sterile alpha motif domain-containing protein 9-like.3 7.184799 6.098363 8.271235 4.2081541 13.121694 0.0000000 0.00e+00 42.7175548 145.49229
111573059 111573059 LOC111573059 tyrosinase-like NA NA NA LOC111573059 tyrosinase-like tyrosinase-like.1 -6.979913 -8.693283 -5.266543 -0.5696771 -8.083106 0.0000000 0.00e+00 16.3250371 -126.23017
129350976 129350976 LOC129350976 receptor-transporting protein 3-like NA NA NA LOC129350976 receptor-transporting protein 3-like receptor-transporting protein 3-like.2 6.890013 5.193076 8.586950 1.7952119 8.056267 0.0000000 0.00e+00 17.9260770 118.60434
111584687 111584687 LOC111584687 probable E3 ubiquitin-protein ligase HERC6 ENSAOCG00000019763 ENSAOCG00000019763 probable E3 ubiquitin-protein ligase HERC6 LOC111584687_ENSAOCG00000019763 probable E3 ubiquitin-protein ligase HERC6 probable E3 ubiquitin-protein ligase HERC6 6.560506 5.256679 7.864333 3.1526642 9.983821 0.0000000 0.00e+00 27.4120030 94.38633
111574762 111574762 LOC111574762 interferon-induced GTP-binding protein Mx ENSAOCG00000006946 MX1 interferon-induced GTP-binding protein Mx LOC111574762_MX1 interferon-induced GTP-binding protein Mx interferon-induced GTP-binding protein Mx 6.332014 5.059698 7.604328 2.9882334 9.874763 0.0000000 0.00e+00 26.8723559 80.56121
111562396 111562396 si:dkeyp-118h9.7 sacsin ENSAOCG00000014036 ENSAOCG00000014036 sacsin-like si:dkeyp-118h9.7_ENSAOCG00000014036 sacsin sacsin 6.307530 5.420958 7.194102 4.7850516 14.116430 0.0000000 0.00e+00 47.4343018 79.20557
111565613 111565613 LOC111565613 cytochrome P450 2F2-like ENSAOCG00000017327 ENSAOCG00000017327 cytochrome P450 2F2-like.6 LOC111565613_ENSAOCG00000017327 cytochrome P450 2F2-like cytochrome P450 2F2-like.4 6.270956 4.887848 7.654063 2.5770157 8.996163 0.0000000 0.00e+00 22.5909561 77.22285
111571572 111571572 LOC111571572 up-regulator of cell proliferation-like NA NA NA LOC111571572 up-regulator of cell proliferation-like up-regulator of cell proliferation-like 6.240235 5.361967 7.118504 4.5522962 14.097855 0.0000000 0.00e+00 47.3489032 75.59587
Top20 differentially expressed genes in CPF vs control (all FC and pvalues; ranked by FC)
entrez_ID NCBI_symbol NCBI_description ensembl_ID ensembl_symbol ensembl_description merged_symbol original_merged_description merged_description logFC CI.L CI.R AveExpr t P.Value adj.P.Val B FC
111577915 111577915 LOC111577915 interferon alpha-inducible protein 27-like protein 2A NA NA NA LOC111577915 interferon alpha-inducible protein 27-like protein 2A interferon alpha-inducible protein 27-like protein 2A.2 6.946023 3.739514 10.1525320 0.7634300 4.298166 0.0000403 0.0001197 1.7857668 123.29948
111588695 111588695 rsad2 radical S-adenosyl methionine domain containing 2 ENSAOCG00000009483 rsad2 radical S-adenosyl methionine domain containing 2 rsad2 radical S-adenosyl methionine domain containing 2 radical S-adenosyl methionine domain containing 2 6.729393 3.644792 9.8139943 0.7886398 4.328689 0.0000359 0.0001077 1.8806903 106.10827
111568546 111568546 lgals17 galectin 17 ENSAOCG00000023360 ENSAOCG00000023360 novel gene (galectin 17-like) lgals17_ENSAOCG00000023360 galectin 17 galectin 17 6.033749 5.058162 7.0093351 5.3118168 12.271595 0.0000000 0.0000000 38.5335360 65.51479
111588557 111588557 LOC111588557 polyubiquitin-like ENSAOCG00000014693 ENSAOCG00000014693 polyubiquitin-like.1 LOC111588557_ENSAOCG00000014693 polyubiquitin-like polyubiquitin-like 5.941070 4.447763 7.4343763 3.1584896 7.893963 0.0000000 0.0000000 17.0555197 61.43843
111582224 111582224 si:zfos-911d5.4 uncharacterized si:zfos-911d5.4 NA NA NA si:zfos-911d5.4 uncharacterized si:zfos-911d5.4 uncharacterized si:zfos-911d5.4 5.906808 2.055372 9.7582441 -0.4572542 3.043054 0.0029977 0.0061066 -1.7807520 59.99656
111576250 111576250 znfx1 zinc finger, NFX1-type containing 1 ENSAOCG00000021079 ZNFX1 zinc finger NFX1-type containing 1 znfx1 zinc finger, NFX1-type containing 1 zinc finger, NFX1-type containing 1 5.689770 4.087651 7.2918889 2.8292284 7.046597 0.0000000 0.0000000 13.1436990 51.61684
129350976 129350976 LOC129350976 receptor-transporting protein 3-like NA NA NA LOC129350976 receptor-transporting protein 3-like receptor-transporting protein 3-like.2 5.591168 3.887623 7.2947130 1.7952119 6.512211 0.0000000 0.0000000 10.5520428 48.20691
111584687 111584687 LOC111584687 probable E3 ubiquitin-protein ligase HERC6 ENSAOCG00000019763 ENSAOCG00000019763 probable E3 ubiquitin-protein ligase HERC6 LOC111584687_ENSAOCG00000019763 probable E3 ubiquitin-protein ligase HERC6 probable E3 ubiquitin-protein ligase HERC6 5.310233 4.002575 6.6178910 3.1526642 8.057475 0.0000000 0.0000000 17.8775960 39.67706
111574762 111574762 LOC111574762 interferon-induced GTP-binding protein Mx ENSAOCG00000006946 MX1 interferon-induced GTP-binding protein Mx LOC111574762_MX1 interferon-induced GTP-binding protein Mx interferon-induced GTP-binding protein Mx 5.275601 3.999973 6.5512283 2.9882334 8.205924 0.0000000 0.0000000 18.5542392 38.73593
111584047 111584047 usp18 ubiquitin specific peptidase 18 ENSAOCG00000021208 ENSAOCG00000021208 ubl carboxyl-terminal hydrolase 18-like usp18_ENSAOCG00000021208 ubiquitin specific peptidase 18 ubiquitin specific peptidase 18 5.239622 3.081092 7.3981514 1.0352805 4.816388 0.0000053 0.0000188 3.7472913 37.78186
111562396 111562396 si:dkeyp-118h9.7 sacsin ENSAOCG00000014036 ENSAOCG00000014036 sacsin-like si:dkeyp-118h9.7_ENSAOCG00000014036 sacsin sacsin 5.236995 4.349495 6.1244945 4.7850516 11.708290 0.0000000 0.0000000 35.8340920 37.71313
111574765 111574765 LOC111574765 interferon-induced GTP-binding protein Mx-like ENSAOCG00000000359 mxb interferon-induced GTP-binding protein Mx-like LOC111574765_mxb interferon-induced GTP-binding protein Mx-like interferon-induced GTP-binding protein Mx-like 5.201757 3.025603 7.3779107 1.7325469 4.742857 0.0000071 0.0000246 3.5578793 36.80314
111589177 111589177 LOC111589177 kelch-like protein 38 ENSAOCG00000020436 KLHL38 kelch-like protein 38.1 LOC111589177_KLHL38 kelch-like protein 38 kelch-like protein 38.1 4.975737 2.170592 7.7808815 1.4020336 3.519505 0.0006545 0.0015263 -0.4723101 31.46632
111588694 111588694 cmpk2 cytidine monophosphate (UMP-CMP) kinase 2, mitochondrial ENSAOCG00000000586 CMPK2 cytidine/uridine monophosphate kinase 2 cmpk2 cytidine monophosphate (UMP-CMP) kinase 2, mitochondrial cytidine monophosphate (UMP-CMP) kinase 2, mitochondrial 4.972745 3.647360 6.2981308 1.8164046 7.444466 0.0000000 0.0000000 14.7524318 31.40115
111565606 111565606 LOC111565606 C-C motif chemokine 21-like ENSAOCG00000021849 ENSAOCG00000021849 C-C motif chemokine 21-like LOC111565606_ENSAOCG00000021849 C-C motif chemokine 21-like C-C motif chemokine 21-like 4.963170 3.768096 6.1582434 3.9229597 8.240318 0.0000000 0.0000000 18.8359784 31.19342
129349373 129349373 LOC129349373 probable serpin E3 NA NA NA LOC129349373 probable serpin E3 probable serpin E3.21 4.899351 1.841616 7.9570865 0.4723930 3.179203 0.0019705 0.0041719 -1.3995279 29.84363
111568689 111568689 LOC111568689 insulin-like growth factor-binding protein 1 ENSAOCG00000018285 igfbp1b insulin-like growth factor-binding protein 1.1 LOC111568689_igfbp1b insulin-like growth factor-binding protein 1 insulin-like growth factor-binding protein 1 4.895474 2.459775 7.3311734 3.0783777 3.987958 0.0001276 0.0003430 0.9459554 29.76354
111583825 111583825 LOC111583825 C-reactive protein-like ENSAOCG00000004271 ENSAOCG00000004271 pentraxin fusion protein-like LOC111583825_ENSAOCG00000004271 C-reactive protein-like C-reactive protein-like.2 -4.886181 -9.547930 -0.2244321 1.5816666 -2.079697 0.0401325 0.0628315 -3.9459846 -29.57243
111571474 111571474 il4i1 interleukin 4 induced 1 ENSAOCG00000023672 ENSAOCG00000023672 L-amino-acid oxidase-like.2 il4i1_ENSAOCG00000023672 interleukin 4 induced 1 interleukin 4 induced 1 4.824605 2.853447 6.7957633 1.9138440 4.856459 0.0000045 0.0000162 3.9529800 28.33680
111586659 111586659 LOC111586659 probable E3 ubiquitin-protein ligase HERC3 NA NA NA LOC111586659 probable E3 ubiquitin-protein ligase HERC3 probable E3 ubiquitin-protein ligase HERC3 4.688654 3.538006 5.8393015 2.7457832 8.085096 0.0000000 0.0000000 17.9764108 25.78846
NULL

Attenuation plot

Alluvial plot

Differentially Expressed genes (p < 0.5, FC>2 or FC<1/2) downregulated by CPFT3IOP but upregulated by CPF
entrez_ID ensembl_ID_CPFT3IOP merged_symbol_CPFT3IOP merged_description_CPFT3IOP logFC_CPFT3IOP logFC_CPF FC_CPFT3IOP FC_CPF rank
9269 111574513 NA LOC111574513 complement C1q-like protein 4.1 -1.508325 2.088413 -2.844797 4.252800 3
16109 111583609 ENSAOCG00000010276 LOC111583609_ENSAOCG00000010276 collagenase 3 -3.501439 1.194282 -11.324999 2.288309 4
7372 111572094 NA LOC111572094 2-epi-5-epi-valiolone synthase-like -1.213500 1.199997 -2.318996 2.297392 6
12086 111578169 ENSAOCG00000008659 fgfbp2a fibroblast growth factor binding protein 2a -1.310079 1.073588 -2.479551 2.104661 7
Differentially Expressed genes (p < 0.5, FC>2 or FC<1/2) upregulated by CPFT3IOP but downregulated by CPF
entrez_ID ensembl_ID_CPFT3IOP merged_symbol_CPFT3IOP merged_description_CPFT3IOP logFC_CPFT3IOP logFC_CPF FC_CPFT3IOP FC_CPF rank
8195 111573140 ENSAOCG00000004145 LOC111573140_steap4 metalloreductase STEAP4-like 2.912831 -3.356776 7.530948 -10.244485 4
7852 111572709 ENSAOCG00000000604 LOC111572709_PTCHD3 patched domain-containing protein 3-like 3.438335 -1.797154 10.840320 -3.475339 7
13760 111580318 NA LOC111580318 UDP-glucuronosyltransferase 2A1-like.6 2.734377 -1.949602 6.654713 -3.862681 9
14285 111581053 ENSAOCG00000014793 LOC111581053_ENSAOCG00000014793 proproteinase E-like 2.294088 -2.273990 4.904437 -4.836590 10
7108 111571739 ENSAOCG00000017399 LOC111571739_ENSAOCG00000017399 complement C1q-like protein 2 1.964056 -2.209516 3.901574 -4.625199 12
8199 111573147 ENSAOCG00000004133 LOC111573147_ENSAOCG00000004133 serum amyloid P-component-like.1 2.576138 -1.440352 5.963411 -2.713870 14
15270 111582409 ENSAOCG00000010775 aqp8a.2_ENSAOCG00000010775 aquaporin 8a, tandem duplicate 2 1.323795 -2.582604 2.503237 -5.990200 15
9181 111574400 ENSAOCG00000020520 LOC111574400_ENSAOCG00000020520 WAP, Kazal, immunoglobulin, Kunitz and NTR domain-containing protein 2-like 3.280654 -1.171148 9.717962 -2.251908 18
2714 111565970 ENSAOCG00000009607 LOC111565970_CSTA cystatin-B-like.1 1.649649 -1.369124 3.137573 -2.583136 20
20342 129347240 NA LOC129347240 glutathione S-transferase A-like.13 2.610210 -1.180202 6.105927 -2.266085 20
5263 111569306 ENSAOCG00000021939 LOC111569306_rdh12l retinol dehydrogenase 12-like 1.731422 -1.239799 3.320549 -2.361656 21
19825 118469194 NA LOC118469194 IgGFc-binding protein-like 1.130180 -1.455974 2.188860 -2.743416 25
7636 111572425 NA LOC111572425 UDP-glucuronosyltransferase 2A1-like.2 1.133238 -1.371671 2.193505 -2.587701 26
20010 118470365 NA LOC118470365 uncharacterized LOC118470365 1.214013 -1.194063 2.319821 -2.287961 29
2542 111565748 ENSAOCG00000016673 c1h15orf48_zgc:153317 chromosome 1 C15orf48 homolog 1.532034 -1.051117 2.891933 -2.072133 30
10498 111576134 ENSAOCG00000024487 LOC111576134_gstr glutathione S-transferase A-like.11 1.042040 -1.359144 2.059137 -2.565329 31
15205 111582297 ENSAOCG00000014922 LOC111582297_ENSAOCG00000014922 cytochrome P450 2F2-like.14 1.076125 -1.224476 2.108366 -2.336705 32
18779 111587842 ENSAOCG00000020073 LOC111587842_ENSAOCG00000020073 cytochrome c oxidase subunit 6A, mitochondrial.1 1.286129 -1.056158 2.438728 -2.079387 32
10616 111576278 ENSAOCG00000019724 samhd1 SAM domain and HD domain 1 1.398650 -1.050244 2.636547 -2.070880 32
11193 111577049 ENSAOCG00000007922 LOC111577049_prss1 trypsin-3-like.1 1.184164 -1.135683 2.272317 -2.197226 33
[1] "0  differentially expressed genes upregulated by both CPF and T3IOP"
[1] "0  differentially expressed genes downregulated by both CPF and T3IOP"
[1] "4 differentially expressed genes downregulated by T3IOP but upregulated by CPF"
[1] "20 differentially expressed genes upregulated by T3IOP but downreegulated by CPF"
Error: object 'T3IOP_only' not found

Comparing T3IOP and CPF+T3IOP

Top20 differentially expressed genes in CPFT3IOP vs control (all FC and pvalues; ranked by FC)
entrez_ID NCBI_symbol NCBI_description ensembl_ID ensembl_symbol ensembl_description merged_symbol original_merged_description merged_description logFC CI.L CI.R AveExpr t P.Value adj.P.Val B FC
129348303 129348303 LOC129348303 uncharacterized LOC129348303 NA NA NA LOC129348303 uncharacterized LOC129348303 uncharacterized LOC129348303 -10.068848 -13.977676 -6.160020 3.1991964 -5.111081 0.0000016 7.20e-06 4.9057973 -1074.05197
118470957 118470957 LOC118470957 uncharacterized LOC118470957 NA NA NA LOC118470957 uncharacterized LOC118470957 uncharacterized LOC118470957 -9.506054 -14.438282 -4.573826 1.5594816 -3.824165 0.0002294 6.81e-04 0.4087158 -727.12211
111588695 111588695 rsad2 radical S-adenosyl methionine domain containing 2 ENSAOCG00000009483 rsad2 radical S-adenosyl methionine domain containing 2 rsad2 radical S-adenosyl methionine domain containing 2 radical S-adenosyl methionine domain containing 2 8.754387 5.680109 11.828665 0.7886398 5.650177 0.0000002 9.00e-07 7.0320258 431.85001
111577915 111577915 LOC111577915 interferon alpha-inducible protein 27-like protein 2A NA NA NA LOC111577915 interferon alpha-inducible protein 27-like protein 2A interferon alpha-inducible protein 27-like protein 2A.2 8.528721 5.330104 11.727338 0.7634300 5.290554 0.0000007 3.60e-06 5.6193709 369.31839
111588653 111588653 LOC111588653 calpain-1 catalytic subunit-like NA NA NA LOC111588653 calpain-1 catalytic subunit-like calpain-1 catalytic subunit-like.5 -8.430433 -10.463852 -6.397014 3.1497123 -8.226262 0.0000000 0.00e+00 18.2424731 -344.99535
111565606 111565606 LOC111565606 C-C motif chemokine 21-like ENSAOCG00000021849 ENSAOCG00000021849 C-C motif chemokine 21-like LOC111565606_ENSAOCG00000021849 C-C motif chemokine 21-like C-C motif chemokine 21-like 7.655180 6.465892 8.844468 3.9229597 12.771674 0.0000000 0.00e+00 40.9585606 201.57603
111564448 111564448 LOC111564448 acidic mammalian chitinase-like ENSAOCG00000003252 ENSAOCG00000003252 CHIO1, chitinase O-1, chia2/9-like LOC111564448_ENSAOCG00000003252 acidic mammalian chitinase-like acidic mammalian chitinase-like.1 -7.495890 -8.258235 -6.733545 5.1246678 -19.509732 0.0000000 0.00e+00 69.4069184 -180.50438
111568546 111568546 lgals17 galectin 17 ENSAOCG00000023360 ENSAOCG00000023360 novel gene (galectin 17-like) lgals17_ENSAOCG00000023360 galectin 17 galectin 17 7.418167 6.441187 8.395147 5.3118168 15.065744 0.0000000 0.00e+00 51.8013770 171.03729
111576250 111576250 znfx1 zinc finger, NFX1-type containing 1 ENSAOCG00000021079 ZNFX1 zinc finger NFX1-type containing 1 znfx1 zinc finger, NFX1-type containing 1 zinc finger, NFX1-type containing 1 7.309194 5.711657 8.906730 2.8292284 9.078167 0.0000000 0.00e+00 22.9508086 158.59392
111571474 111571474 il4i1 interleukin 4 induced 1 ENSAOCG00000023672 ENSAOCG00000023672 L-amino-acid oxidase-like.2 il4i1_ENSAOCG00000023672 interleukin 4 induced 1 interleukin 4 induced 1 7.246212 5.296486 9.195938 1.9138440 7.374234 0.0000000 0.00e+00 14.7323110 151.81936
111576689 111576689 LOC111576689 protein translocase subunit SecA-like NA NA NA LOC111576689 protein translocase subunit SecA-like protein translocase subunit SecA-like 7.245204 4.470180 10.020229 -1.0328861 5.180400 0.0000012 5.50e-06 5.0171681 151.71337
111588557 111588557 LOC111588557 polyubiquitin-like ENSAOCG00000014693 ENSAOCG00000014693 polyubiquitin-like.1 LOC111588557_ENSAOCG00000014693 polyubiquitin-like polyubiquitin-like 7.185437 5.695307 8.675567 3.1584896 9.567721 0.0000000 0.00e+00 25.3551057 145.55668
118469095 118469095 sb:cb1081 sterile alpha motif domain-containing protein 9-like NA NA NA sb:cb1081 sterile alpha motif domain-containing protein 9-like sterile alpha motif domain-containing protein 9-like.3 7.184799 6.098363 8.271235 4.2081541 13.121694 0.0000000 0.00e+00 42.7175548 145.49229
111573059 111573059 LOC111573059 tyrosinase-like NA NA NA LOC111573059 tyrosinase-like tyrosinase-like.1 -6.979913 -8.693283 -5.266543 -0.5696771 -8.083106 0.0000000 0.00e+00 16.3250371 -126.23017
129350976 129350976 LOC129350976 receptor-transporting protein 3-like NA NA NA LOC129350976 receptor-transporting protein 3-like receptor-transporting protein 3-like.2 6.890013 5.193076 8.586950 1.7952119 8.056267 0.0000000 0.00e+00 17.9260770 118.60434
111584687 111584687 LOC111584687 probable E3 ubiquitin-protein ligase HERC6 ENSAOCG00000019763 ENSAOCG00000019763 probable E3 ubiquitin-protein ligase HERC6 LOC111584687_ENSAOCG00000019763 probable E3 ubiquitin-protein ligase HERC6 probable E3 ubiquitin-protein ligase HERC6 6.560506 5.256679 7.864333 3.1526642 9.983821 0.0000000 0.00e+00 27.4120030 94.38633
111574762 111574762 LOC111574762 interferon-induced GTP-binding protein Mx ENSAOCG00000006946 MX1 interferon-induced GTP-binding protein Mx LOC111574762_MX1 interferon-induced GTP-binding protein Mx interferon-induced GTP-binding protein Mx 6.332014 5.059698 7.604328 2.9882334 9.874763 0.0000000 0.00e+00 26.8723559 80.56121
111562396 111562396 si:dkeyp-118h9.7 sacsin ENSAOCG00000014036 ENSAOCG00000014036 sacsin-like si:dkeyp-118h9.7_ENSAOCG00000014036 sacsin sacsin 6.307530 5.420958 7.194102 4.7850516 14.116430 0.0000000 0.00e+00 47.4343018 79.20557
111565613 111565613 LOC111565613 cytochrome P450 2F2-like ENSAOCG00000017327 ENSAOCG00000017327 cytochrome P450 2F2-like.6 LOC111565613_ENSAOCG00000017327 cytochrome P450 2F2-like cytochrome P450 2F2-like.4 6.270956 4.887848 7.654063 2.5770157 8.996163 0.0000000 0.00e+00 22.5909561 77.22285
111571572 111571572 LOC111571572 up-regulator of cell proliferation-like NA NA NA LOC111571572 up-regulator of cell proliferation-like up-regulator of cell proliferation-like 6.240235 5.361967 7.118504 4.5522962 14.097855 0.0000000 0.00e+00 47.3489032 75.59587
Top20 differentially expressed genes in CPF vs control (all FC and pvalues; ranked by FC)
entrez_ID NCBI_symbol NCBI_description ensembl_ID ensembl_symbol ensembl_description merged_symbol original_merged_description merged_description logFC CI.L CI.R AveExpr t P.Value adj.P.Val B FC
129348303 129348303 LOC129348303 uncharacterized LOC129348303 NA NA NA LOC129348303 uncharacterized LOC129348303 uncharacterized LOC129348303 -9.732320 -13.418829 -6.045812 3.1991964 -5.238183 0.0000009 0.0000070 5.4255579 -850.59009
118470957 118470957 LOC118470957 uncharacterized LOC118470957 NA NA NA LOC118470957 uncharacterized LOC118470957 uncharacterized LOC118470957 -8.994404 -13.585266 -4.403540 1.5594816 -3.887385 0.0001832 0.0007483 0.6272601 -510.01768
111588653 111588653 LOC111588653 calpain-1 catalytic subunit-like NA NA NA LOC111588653 calpain-1 catalytic subunit-like calpain-1 catalytic subunit-like.5 -8.061279 -9.976454 -6.146103 3.1497123 -8.351700 0.0000000 0.0000000 18.9542624 -267.10790
111573059 111573059 LOC111573059 tyrosinase-like NA NA NA LOC111573059 tyrosinase-like tyrosinase-like.1 -6.709533 -8.422903 -4.996163 -0.5696771 -7.769991 0.0000000 0.0000000 15.0572505 -104.65758
111564448 111564448 LOC111564448 acidic mammalian chitinase-like ENSAOCG00000003252 ENSAOCG00000003252 CHIO1, chitinase O-1, chia2/9-like LOC111564448_ENSAOCG00000003252 acidic mammalian chitinase-like acidic mammalian chitinase-like.1 -5.743945 -6.231172 -5.256718 5.1246678 -23.391534 0.0000000 0.0000000 85.0518517 -53.59197
111582289 111582289 LOC111582289 hatching enzyme 1.2-like NA NA NA LOC111582289 hatching enzyme 1.2-like hatching enzyme 1.2-like -5.029215 -6.119961 -3.938469 0.5268815 -9.148632 0.0000000 0.0000000 21.9421432 -32.65462
111586982 111586982 LOC111586982 alpha-1-antitrypsin homolog ENSAOCG00000011906 ENSAOCG00000011906 alpha-1-antitrypsin homolog.1 LOC111586982_ENSAOCG00000011906 alpha-1-antitrypsin homolog alpha-1-antitrypsin homolog.2 4.976365 3.631521 6.321209 0.8618981 7.342091 0.0000000 0.0000000 14.6435494 31.48003
111562991 111562991 aqp10a aquaporin 10a ENSAOCG00000008773 aqp10a aquaporin-10-like aqp10a aquaporin 10a aquaporin 10a 4.781471 3.751631 5.811312 0.4504553 9.212365 0.0000000 0.0000000 22.7693300 27.50213
118470600 118470600 LOC118470600 uncharacterized LOC118470600 NA NA NA LOC118470600 uncharacterized LOC118470600 uncharacterized LOC118470600 4.680772 4.049469 5.312075 -0.1871561 14.711577 0.0000000 0.0000000 47.7876207 25.64796
111582738 111582738 LOC111582738 nuclear factor interleukin-3-regulated protein-like ENSAOCG00000021476 ENSAOCG00000021476 nuclear factor interleukin-3-regulated protein-like.1 LOC111582738_ENSAOCG00000021476 nuclear factor interleukin-3-regulated protein-like nuclear factor interleukin-3-regulated protein-like 4.623166 4.162032 5.084301 2.5774259 19.892603 0.0000000 0.0000000 71.8017252 24.64403
118469143 118469143 LOC118469143 uncharacterized LOC118469143 NA NA NA LOC118469143 uncharacterized LOC118469143 uncharacterized LOC118469143 -4.510040 -5.157803 -3.862277 2.8303418 -13.814768 0.0000000 0.0000000 44.9684962 -22.78543
111579324 111579324 LOC111579324 lactase/phlorizin hydrolase-like ENSAOCG00000014483 LCT lactase-phlorizin hydrolase-like.1 LOC111579324_LCT lactase/phlorizin hydrolase-like lactase/phlorizin hydrolase-like 4.379545 3.820212 4.938879 4.5659675 15.535939 0.0000000 0.0000000 53.9126034 20.81491
111574400 111574400 LOC111574400 WAP, Kazal, immunoglobulin, Kunitz and NTR domain-containing protein 2-like ENSAOCG00000020520 ENSAOCG00000020520 WAP, Kazal, immunoglobulin, Kunitz and NTR domain-containing protein 2-like LOC111574400_ENSAOCG00000020520 WAP, Kazal, immunoglobulin, Kunitz and NTR domain-containing protein 2-like WAP, Kazal, immunoglobulin, Kunitz and NTR domain-containing protein 2-like 4.331794 4.066081 4.597506 3.4290414 32.347131 0.0000000 0.0000000 112.4193036 20.13723
118471637 118471637 LOC118471637 uncharacterized LOC118471637 NA NA NA LOC118471637 uncharacterized LOC118471637 uncharacterized LOC118471637 -4.181974 -4.888625 -3.475323 5.2649032 -11.742369 0.0000000 0.0000000 36.0408087 -18.15096
111565613 111565613 LOC111565613 cytochrome P450 2F2-like ENSAOCG00000017327 ENSAOCG00000017327 cytochrome P450 2F2-like.6 LOC111565613_ENSAOCG00000017327 cytochrome P450 2F2-like cytochrome P450 2F2-like.4 4.158361 2.760076 5.556646 2.5770157 5.900733 0.0000001 0.0000005 8.0679960 17.85630
111566579 111566579 LOC111566579 placenta-specific gene 8 protein-like ENSAOCG00000010064 plac8.2 placenta-specific gene 8 protein-like.1 LOC111566579_plac8.2 placenta-specific gene 8 protein-like placenta-specific gene 8 protein-like 3.957414 2.940895 4.973933 0.3953221 7.724593 0.0000000 0.0000000 16.1030459 15.53461
111586185 111586185 dio3a iodothyronine deiodinase 3a NA NA NA dio3a iodothyronine deiodinase 3a iodothyronine deiodinase 3a 3.909003 3.607792 4.210213 2.7162596 25.749855 0.0000000 0.0000000 92.2645967 15.02197
111564199 111564199 LOC111564199 meprin A subunit beta-like NA NA NA LOC111564199 meprin A subunit beta-like meprin A subunit beta-like -3.837511 -6.366941 -1.308081 -0.6712350 -3.010278 0.0033101 0.0092976 -1.8205550 -14.29572
111574814 111574814 LOC111574814 hemoglobin subunit beta-like ENSAOCG00000004104 HBE1 hemoglobin subunit beta-1, MN-cluster LOC111574814_HBE1 hemoglobin subunit beta-like hemoglobin subunit beta-like.2 -3.747877 -4.141205 -3.354549 5.9702150 -18.906457 0.0000000 0.0000000 68.4349934 -13.43456
111570504 111570504 cdh27 cadherin 27 ENSAOCG00000012441 ENSAOCG00000012441 cadherin-like protein 26.1 cdh27_ENSAOCG00000012441 cadherin 27 cadherin 27 -3.727387 -4.401882 -3.052893 1.0268691 -10.964920 0.0000000 0.0000000 31.1827063 -13.24510

Attenuation plot

Alluvial plot

Venn diagrams

Packages used

R version 4.3.2 (2023-10-31 ucrt)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows 11 x64 (build 22631)

Matrix products: default


locale:
[1] LC_COLLATE=English_United States.utf8  LC_CTYPE=English_United States.utf8   
[3] LC_MONETARY=English_United States.utf8 LC_NUMERIC=C                          
[5] LC_TIME=English_United States.utf8    

time zone: Asia/Shanghai
tzcode source: internal

attached base packages:
[1] grid      stats4    stats     graphics  grDevices utils     datasets  methods  
[9] base     

other attached packages:
 [1] venneuler_1.1-4             rJava_1.0-11                ggalluvial_0.12.5          
 [4] mgsa_1.50.0                 gplots_3.1.3                aplot_0.2.2                
 [7] patchwork_1.2.0             enrichplot_1.22.0           clusterProfiler_4.10.0     
[10] biomaRt_2.58.2              ggVennDiagram_1.5.2         ggpubr_0.6.0               
[13] cowplot_1.1.3               factoextra_1.0.7            ggalt_0.4.0                
[16] ggrepel_0.9.5               dendextend_1.17.1           GetoptLong_1.0.5           
[19] ComplexHeatmap_2.18.0       knitr_1.45                  kneedle_1.0.0              
[22] gridBase_0.4-7              RColorBrewer_1.1-3          DESeq2_1.42.0              
[25] SummarizedExperiment_1.32.0 MatrixGenerics_1.14.0       matrixStats_1.2.0          
[28] gridExtra_2.3               ggforce_0.4.1               lubridate_1.9.3            
[31] forcats_1.0.0               stringr_1.5.1               dplyr_1.1.4                
[34] purrr_1.0.2                 readr_2.1.5                 tidyr_1.3.1                
[37] tibble_3.2.1                ggplot2_3.5.0               tidyverse_2.0.0            
[40] magrittr_2.0.3              edgeR_4.0.14                limma_3.58.1               
[43] tximport_1.30.0             GenomicFeatures_1.54.1      AnnotationDbi_1.64.1       
[46] Biobase_2.62.0              formattable_0.2.1           jsonlite_1.8.8             
[49] BSgenome_1.70.2             rtracklayer_1.62.0          BiocIO_1.12.0              
[52] Biostrings_2.70.2           XVector_0.42.0              GenomicRanges_1.54.1       
[55] GenomeInfoDb_1.38.5         IRanges_2.36.0              S4Vectors_0.40.2           
[58] BiocGenerics_0.48.1        

loaded via a namespace (and not attached):
  [1] vroom_1.6.5                   progress_1.2.3               
  [3] urlchecker_1.0.1              vctrs_0.6.5                  
  [5] digest_0.6.34                 png_0.1-8                    
  [7] shape_1.4.6.1                 proxy_0.4-27                 
  [9] magick_2.8.2                  MASS_7.3-60                  
 [11] reshape2_1.4.4                httpuv_1.6.14                
 [13] foreach_1.5.2                 qvalue_2.34.0                
 [15] withr_3.0.0                   xfun_0.41                    
 [17] ggfun_0.1.4                   ellipsis_0.3.2               
 [19] memoise_2.0.1                 commonmark_1.9.1             
 [21] gson_0.1.0                    profvis_0.3.8                
 [23] tidytree_0.4.6                zoo_1.8-12                   
 [25] GlobalOptions_0.1.2           gtools_3.9.5                 
 [27] quantmod_0.4.26               prettyunits_1.2.0            
 [29] KEGGREST_1.42.0               promises_1.2.1               
 [31] httr_1.4.7                    rstatix_0.7.2                
 [33] restfulr_0.0.15               rstudioapi_0.16.0            
 [35] units_0.8-5                   miniUI_0.1.1.1               
 [37] generics_0.1.3                DOSE_3.28.2                  
 [39] curl_5.2.0                    zlibbioc_1.48.0              
 [41] Rsubread_2.16.1               ggraph_2.1.0                 
 [43] polyclip_1.10-6               GenomeInfoDbData_1.2.11      
 [45] SparseArray_1.2.3             interactiveDisplayBase_1.40.0
 [47] xtable_1.8-4                  doParallel_1.0.17            
 [49] evaluate_0.23                 S4Arrays_1.2.0               
 [51] BiocFileCache_2.10.2          hms_1.1.3                    
 [53] colorspace_2.1-0              filelock_1.0.3               
 [55] later_1.3.2                   viridis_0.6.5                
 [57] ggtree_3.10.1                 lattice_0.21-9               
 [59] XML_3.99-0.16.1               shadowtext_0.1.3             
 [61] xts_0.13.2                    ggupset_0.3.0                
 [63] class_7.3-22                  pillar_1.9.0                 
 [65] nlme_3.1-163                  iterators_1.0.14             
 [67] caTools_1.18.2                compiler_4.3.2               
 [69] stringi_1.8.3                 sf_1.0-16                    
 [71] devtools_2.4.5                GenomicAlignments_1.38.2     
 [73] plyr_1.8.9                    crayon_1.5.2                 
 [75] abind_1.4-5                   gridGraphics_0.5-1           
 [77] ggtext_0.1.2                  locfit_1.5-9.8               
 [79] graphlayouts_1.1.0            bit_4.0.5                    
 [81] fastmatch_1.1-4               codetools_0.2-19             
 [83] TTR_0.24.4                    bslib_0.7.0                  
 [85] e1071_1.7-14                  mime_0.12                    
 [87] splines_4.3.2                 markdown_1.12                
 [89] circlize_0.4.16               Rcpp_1.0.12                  
 [91] dbplyr_2.5.0                  HDO.db_0.99.1                
 [93] Rttf2pt1_1.3.12               gridtext_0.1.5               
 [95] blob_1.2.4                    utf8_1.2.4                   
 [97] clue_0.3-65                   BiocVersion_3.18.1           
 [99] fs_1.6.3                      pkgbuild_1.4.4               
[101] ggsignif_0.6.4                ggplotify_0.1.2              
[103] Matrix_1.6-5                  statmod_1.5.0                
[105] tzdb_0.4.0                    tweenr_2.0.2                 
[107] pkgconfig_2.0.3               tools_4.3.2                  
[109] cachem_1.0.8                  RSQLite_2.3.5                
[111] viridisLite_0.4.2             DBI_1.2.2                    
[113] fastmap_1.1.1                 rmarkdown_2.26               
[115] scales_1.3.0                  usethis_2.2.3                
[117] Rsamtools_2.18.0              broom_1.0.5                  
[119] AnnotationHub_3.10.0          sass_0.4.9                   
[121] BiocManager_1.30.22           carData_3.0-5                
[123] snow_0.4-4                    farver_2.1.1                 
[125] tidygraph_1.3.1               scatterpie_0.2.2             
[127] yaml_2.3.8                    cli_3.6.2                    
[129] lifecycle_1.0.4               sessioninfo_1.2.2            
[131] backports_1.4.1               BiocParallel_1.36.0          
[133] timechange_0.3.0              gtable_0.3.4                 
[135] rjson_0.2.21                  parallel_4.3.2               
[137] ape_5.7-1                     bitops_1.0-7                 
[139] bit64_4.0.5                   assertthat_0.2.1             
[141] yulab.utils_0.1.4             jquerylib_0.1.4              
[143] GOSemSim_2.28.1               lazyeval_0.2.2               
[145] shiny_1.8.1.1                 htmltools_0.5.8.1            
[147] proj4_1.0-14                  GO.db_3.18.0                 
[149] rappdirs_0.3.3                glue_1.7.0                   
[151] RCurl_1.98-1.14               treeio_1.26.0                
[153] classInt_0.4-10               igraph_2.0.1.1               
[155] extrafontdb_1.0               R6_2.5.1                     
[157] dupRadar_1.32.0               labeling_0.4.3               
[159] cluster_2.1.4                 pkgload_1.3.4                
[161] DelayedArray_0.28.0           tidyselect_1.2.1             
[163] maps_3.4.2                    xml2_1.3.6                   
[165] ash_1.0-15                    car_3.1-2                    
[167] emo_0.0.0.9000                munsell_0.5.1                
[169] KernSmooth_2.23-22            data.table_1.15.0            
[171] htmlwidgets_1.6.4             fgsea_1.28.0                 
[173] rlang_1.1.3                   extrafont_0.19               
[175] remotes_2.5.0                 ggnewscale_0.4.9             
[177] fansi_1.0.6                   Cairo_1.6-2                  


Analysis Notebook
Reynaud, Vianello, et al. “The multi-level effect of chlorpyrifos during clownfish metamorphosis”

RNotebook by Stefano Vianello, Marine Eco-Evo-Devo unit, Academia Sinica Marine Research Station
This work is licensed under a Creative Commons Attribution-NonCommercial 4.0 International License with the additional reservation of the rights to non-human text and data mining, AI training, and similar technologies, which are not granted.

Creative Commons License

LS0tDQp0aXRsZTogIiZuYnNwOyINCiNhdXRob3JzOiBTdGVmYW5vIFZpYW5lbGxvLCBNYXJpbmUgRWNvLUV2by1EZXZvIFVuaXQsIEFjYWRlbWlhIFNpbmljYSBNYXJpbmUgUmVzZWFyY2ggU3RhdGlvbg0KI2Zyb20gZGF0YSBmcm9tIE1hdGhpZXUgUmV5bmF1ZCBhbmQgRmlvbmEgTGVlDQojZGF0ZTogMjAyMg0KDQpvdXRwdXQ6DQogIGh0bWxfbm90ZWJvb2s6IA0KICAgIGNzczogc3R5bGUuY3NzDQogICAgdG9jOiB0cnVlDQogICAgdG9jX2Zsb2F0OiB0cnVlDQogIGh0bWxfZG9jdW1lbnQ6DQogICAgY3NzOiBzdHlsZS5jc3MNCiAgICBkZl9wcmludDogcGFnZWQNCiAgcGRmX2RvY3VtZW50OiBkZWZhdWx0DQotLS0NCg0KIVtdKEM6XFVzZXJzXERvY3RvclxQaWN0dXJlc1xjbG93bmZpc2hfYmFubmVyLlBORykgDQoNCiMjIEFuYWx5c2lzIE5vdGVib29rIHsudGFic2V0fQ0KDQojIyMgSW50cm9kdWN0aW9uIHRvIHRoZSBkYXRhc2V0IGFuZCBleHBlcmltZW50YWwgZGVzaWduIA0KPGJyLz4NCjxici8+DQoNCjo6OmRlbW8NClRoaXMgUm1hcmtkb3duIG5vdGVib29rIGRlc2NyaWJlcyB0aGUgYW5hbHlzaXMgb2YgYnVsa1JOQXNlcSBkYXRhIG9mICpBbXBoaXByaW9uIG9jZWxsYXJpcyogbGFydmFlIHRyZWF0ZWQgd2l0aCBhIHNlbGVjdGlvbiBvZiBkcnVncyBmcm9tIDhkcGggdG8gMTNkcGggKDUgZGF5cyB0b3RhbCksIGkuZS4gdW50aWwgY29udHJvbCBsYXJ2YWUgaGFkIG1ldGFtb3JwaG9zZWQuIFRoZSBhaW0gb2YgdGhlIGV4cGVyaW1lbnQgd2FzIHRvIGRldGVjdCB0aGUgZ2VuZXJhbCBlZmZlY3RzIG9mIHRoZSBvcmdhbm9waG9zcGhhdGUgcGVzdGljaWRlIENobG9ycHlyaWZvcyAoQ1BGKSBvbiBjbG93bmZpc2ggbGFydmFlIGFzIHRoZXkgdW5kZXJnbyBtZXRhbW9ycGhvc2lzLCBhbmQgc3BlY2lmaWNhbGx5IG9uIHRoZWlyIHRoeXJvaWQgaG9ybW9uZSBzaWduYWxsaW5nIHBhdGh3YXkuICpuPTEwKiBsYXJ2YWUgd2VyZSAgY29sbGVjdGVkICBhdCB0aGUgZW5kIG9mIGVhY2ggb2YgdGhlIDUgdHJlYXRtZW50cyAoaS5lLiBhdCAxM2RwaCksIFJOQSB3YXMgZXh0cmFjdGVkIGZyb20gZWFjaCBsYXJ2YSwgYW5kIFJOQSB3YXMgc2VxdWVuY2VkICh0b3RhbCAqbj01MCopLiAqKlRyZWF0bWVudHMqKjogRE1TTyAoY29udHJvbCksIFQzK0lPUCAocG9zaXRpdmUgY29udHJvbCwgaW5kdWN0aW9uIG9mIG1ldGFtb3JwaG9zaXMpLCBNUEkgKG5lZ2F0aXZlIGNvbnRyb2wsIGJsb2NrYWRlIG9mIG1ldGFtb3JwaG9zaXMpLCBDUEYgKHRlc3QgZHJ1ZyksIENQRitUMytJT1AuIA0KOjo6DQoNCjxici8+DQo8YnIvPg0KIVtdKEM6XFVzZXJzXERvY3RvclxQaWN0dXJlc1xDUEZfZXhwZXJpbWVudGFsX2Rlc2lnbi5QTkcpDQoNCg0KYGBge3IsIGV2YWw9VFJVRSwgaW5jbHVkZT1GQUxTRSwgZWNobz1GQUxTRX0NCiMjIEluc3RhbGwgdGhlIGZvbGxvd2luZyBwYWNrYWdlcyBvbiB5b3VyIG1hY2hpbmUsIGlmIHRoZXNlIGhhdmUgbm90IGJlZW4gaW5zdGFsbGVkIGFscmVhZHkNCiMgTm90ZTogb25seSBuZWVkIHRvIHJ1biB0aGlzIGNlbGwgaWYgeW91IGhhdmUgbmV2ZXIgcnVuIHRoaXMgY29kZSBvbiB0aGlzIG1hY2hpbmUNCg0KaWYgKCFyZXF1aXJlTmFtZXNwYWNlKCJCaW9jTWFuYWdlciIpKQ0KICAgIGluc3RhbGwucGFja2FnZXMoIkJpb2NNYW5hZ2VyIikNCg0KQmlvY01hbmFnZXI6Omluc3RhbGwoYygibGltbWEiLCAiZWRnZVIiLCAiR2Vub21pY0ZlYXR1cmVzIiwgInR4aW1wb3J0IiwgIkRFU2VxMiIsICJDb21wbGV4SGVhdG1hcCIsICJjbHVzdGVyUHJvZmlsZXIiLCAibWdzYSIpKQ0KaW5zdGFsbC5wYWNrYWdlcyhjKCJqc29ubGl0ZSIsICJmb3JtYXR0YWJsZSIsICJtYWdyaXR0ciIsICJ0aWR5dmVyc2UiLCAiZ2dmb3JjZSIsICJncmlkIiwgImdyaWRFeHRyYSIsICJncmlkQmFzZSIsICJrbmVlZGxlIiwgImtuaXRyIiwgIlJDb2xvckJyZXdlciIsICJkZW5kZXh0ZW5kIiwgImdncmVwZWwiLCAiZ2dhbHQiLCAiZmFjdG9leHRyYSIsICJjb3dwbG90IiwgImdncHViciIsICJnZ1Zlbm5EaWFncmFtIiwgInZlbm5ldWxlciIpKQ0KYGBgDQoNCg0KYGBge3IsIGV2YWw9VFJVRSwgaW5jbHVkZT1GQUxTRSwgbWVzc2FnZSA9IFQsIGVjaG89RkFMU0V9DQojICNMb2FkIGxpYnJhcmllcyBmcm9tIGluc3RhbGxlZCBwYWNrYWdlcw0KIyBOb3RlOiB5b3UgbmVlZCB0byBydW4gdGhpcyBjZWxsIGV2ZXJ5IHRpbWUgeW91IHN0YXJ0IGEgbmV3IFIgc2Vzc2lvbg0KbGlicmFyeShqc29ubGl0ZSkNCmxpYnJhcnkoZm9ybWF0dGFibGUpDQpsaWJyYXJ5KEdlbm9taWNGZWF0dXJlcykNCmxpYnJhcnkodHhpbXBvcnQpDQpsaWJyYXJ5KGVkZ2VSKQ0KbGlicmFyeShtYWdyaXR0cikNCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShnZ2ZvcmNlKQ0KbGlicmFyeShncmlkKQ0KbGlicmFyeShncmlkRXh0cmEpDQpsaWJyYXJ5KERFU2VxMikNCmxpYnJhcnkoUkNvbG9yQnJld2VyKQ0KbGlicmFyeShncmlkQmFzZSkNCmxpYnJhcnkoa25lZWRsZSkNCmxpYnJhcnkoa25pdHIpDQpsaWJyYXJ5KENvbXBsZXhIZWF0bWFwKQ0KbGlicmFyeShkZW5kZXh0ZW5kKQ0KbGlicmFyeShnZ3JlcGVsKQ0KbGlicmFyeShnZ2FsdCkNCmxpYnJhcnkoZmFjdG9leHRyYSkNCmxpYnJhcnkoY293cGxvdCkNCmxpYnJhcnkoZ2dwdWJyKQ0KbGlicmFyeShjbHVzdGVyUHJvZmlsZXIpDQpsaWJyYXJ5KGdnVmVubkRpYWdyYW0pDQpsaWJyYXJ5KG1nc2EpDQpsaWJyYXJ5KHZlbm5ldWxlcikNCmBgYA0KDQoNCiMjIyBHZW5lIGxldmVsIHJlYWQgcXVhbnRpZmljYXRpb24NCg0KIyMjIyB7LnRhYnNldH0NCiMjIyMjIEltcG9ydGluZyBjb3VudHMgYW5kIHNhbXBsZSBtZXRhZGF0YSANCjxici8+DQpfX1N0ZXAgMTpfXyBXZSBzdGFydCBieSBjcmVhdGluZyBhIGRhdGEtdGFibGUgc3VtbWFyaXNpbmcgc2FtcGxlIG1ldGFkYXRhDQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0Kc2FtcGxlcyA8LSBkYXRhLmZyYW1lKG1hdHJpeChuY29sID0gNiwgbnJvdyA9IDEwMCkpIA0KIyBhc3NpZ24gdGl0bGVzIHRvIHRoZSBjb2x1bW5zDQpjb2x1bW5fdGl0bGVzIDwtIGMoImZpbGVuYW1lIiwgImxpYl9pZCIsImxhbmUiLCAidHJlYXRtZW50IiwgIm9yaWdpbmFsX2xhcnZhbF9pZCIsICJsYWJlbCIpDQpjb2xuYW1lcyhzYW1wbGVzKSA8LSBjb2x1bW5fdGl0bGVzDQojIGNsZWFuIHVwIHVudXNlZCB2YXJpYWJsZXMNCnJtKGNvbHVtbl90aXRsZXMpDQoNCiNub3RlOiAiZmlsZW5hbWUiIG11c3QgYmUgdGhlIG5hbWUgb2YgdGhlIHNhbG1vbiBxdWFudGlmaWNhdGlvbiBmb2xkZXINCnNhbXBsZXMkZmlsZW5hbWUgPC0gYygiTFRTMjNfRlowMV9TMV9MMDAxIiwiTFRTMjNfRlowMV9TMV9MMDAyIiwNCiAgICAgICAgICAgICAgICAgICAgICAiTFRTMjNfRlowMl9TMl9MMDAxIiwiTFRTMjNfRlowMl9TMl9MMDAyIiwNCiAgICAgICAgICAgICAgICAgICAgICAiTFRTMjNfRlowM19TM19MMDAxIiwiTFRTMjNfRlowM19TM19MMDAyIiwNCiAgICAgICAgICAgICAgICAgICAgICAiTFRTMjNfRlowNF9TNF9MMDAxIiwiTFRTMjNfRlowNF9TNF9MMDAyIiwNCiAgICAgICAgICAgICAgICAgICAgICAiTFRTMjNfRlowNV9TNV9MMDAxIiwiTFRTMjNfRlowNV9TNV9MMDAyIiwNCiAgICAgICAgICAgICAgICAgICAgICAiTFRTMjNfRlowNl9TNl9MMDAxIiwiTFRTMjNfRlowNl9TNl9MMDAyIiwNCiAgICAgICAgICAgICAgICAgICAgICAiTFRTMjNfRlowN19TN19MMDAxIiwiTFRTMjNfRlowN19TN19MMDAyIiwNCiAgICAgICAgICAgICAgICAgICAgICAiTFRTMjNfRlowOF9TOF9MMDAxIiwiTFRTMjNfRlowOF9TOF9MMDAyIiwNCiAgICAgICAgICAgICAgICAgICAgICAiTFRTMjNfRlowOV9TOV9MMDAxIiwiTFRTMjNfRlowOV9TOV9MMDAyIiwNCiAgICAgICAgICAgICAgICAgICAgICAiTFRTMjNfRloxMF9TMTBfTDAwMSIsIkxUUzIzX0ZaMTBfUzEwX0wwMDIiLA0KICAgICAgICAgICAgICAgICAgICAgICJMVFMyM19GWjExX1MxMV9MMDAxIiwiTFRTMjNfRloxMV9TMTFfTDAwMiIsDQogICAgICAgICAgICAgICAgICAgICAgIkxUUzIzX0ZaMTJfUzEyX0wwMDEiLCJMVFMyM19GWjEyX1MxMl9MMDAyIiwNCiAgICAgICAgICAgICAgICAgICAgICAiTFRTMjNfRloxM19TMTNfTDAwMSIsIkxUUzIzX0ZaMTNfUzEzX0wwMDIiLA0KICAgICAgICAgICAgICAgICAgICAgICJMVFMyM19GWjE0X1MxNF9MMDAxIiwiTFRTMjNfRloxNF9TMTRfTDAwMiIsDQogICAgICAgICAgICAgICAgICAgICAgIkxUUzIzX0ZaMTVfUzE1X0wwMDEiLCJMVFMyM19GWjE1X1MxNV9MMDAyIiwNCiAgICAgICAgICAgICAgICAgICAgICAiTFRTMjNfRloxNl9TMTZfTDAwMSIsIkxUUzIzX0ZaMTZfUzE2X0wwMDIiLA0KICAgICAgICAgICAgICAgICAgICAgICJMVFMyM19GWjE3X1MxN19MMDAxIiwiTFRTMjNfRloxN19TMTdfTDAwMiIsDQogICAgICAgICAgICAgICAgICAgICAgIkxUUzIzX0ZaMThfUzE4X0wwMDEiLCJMVFMyM19GWjE4X1MxOF9MMDAyIiwNCiAgICAgICAgICAgICAgICAgICAgICAiTFRTMjNfRloxOV9TMTlfTDAwMSIsIkxUUzIzX0ZaMTlfUzE5X0wwMDIiLA0KICAgICAgICAgICAgICAgICAgICAgICJMVFMyM19GWjIwX1MyMF9MMDAxIiwiTFRTMjNfRloyMF9TMjBfTDAwMiIsDQogICAgICAgICAgICAgICAgICAgICAgIkxUUzIzX0ZaMjFfUzIxX0wwMDEiLCJMVFMyM19GWjIxX1MyMV9MMDAyIiwNCiAgICAgICAgICAgICAgICAgICAgICAiTFRTMjNfRloyMl9TMjJfTDAwMSIsIkxUUzIzX0ZaMjJfUzIyX0wwMDIiLA0KICAgICAgICAgICAgICAgICAgICAgICJMVFMyM19GWjIzX1MyM19MMDAxIiwiTFRTMjNfRloyM19TMjNfTDAwMiIsDQogICAgICAgICAgICAgICAgICAgICAgIkxUUzIzX0ZaMjRfUzI0X0wwMDEiLCJMVFMyM19GWjI0X1MyNF9MMDAyIiwNCiAgICAgICAgICAgICAgICAgICAgICAiTFRTMjNfRloyNV9TMjVfTDAwMSIsIkxUUzIzX0ZaMjVfUzI1X0wwMDIiLA0KICAgICAgICAgICAgICAgICAgICAgICJMVFMyM19GWjI2X1MyNl9MMDAxIiwiTFRTMjNfRloyNl9TMjZfTDAwMiIsDQogICAgICAgICAgICAgICAgICAgICAgIkxUUzIzX0ZaMjdfUzI3X0wwMDEiLCJMVFMyM19GWjI3X1MyN19MMDAyIiwNCiAgICAgICAgICAgICAgICAgICAgICAiTFRTMjNfRloyOF9TMjhfTDAwMSIsIkxUUzIzX0ZaMjhfUzI4X0wwMDIiLA0KICAgICAgICAgICAgICAgICAgICAgICJMVFMyM19GWjI5X1MyOV9MMDAxIiwiTFRTMjNfRloyOV9TMjlfTDAwMiIsDQogICAgICAgICAgICAgICAgICAgICAgIkxUUzIzX0ZaMzBfUzMwX0wwMDEiLCJMVFMyM19GWjMwX1MzMF9MMDAyIiwNCiAgICAgICAgICAgICAgICAgICAgICAiTFRTMjNfRlozMV9TMzFfTDAwMSIsIkxUUzIzX0ZaMzFfUzMxX0wwMDIiLA0KICAgICAgICAgICAgICAgICAgICAgICJMVFMyM19GWjMyX1MzMl9MMDAxIiwiTFRTMjNfRlozMl9TMzJfTDAwMiIsDQogICAgICAgICAgICAgICAgICAgICAgIkxUUzIzX0ZaMzNfUzMzX0wwMDEiLCJMVFMyM19GWjMzX1MzM19MMDAyIiwNCiAgICAgICAgICAgICAgICAgICAgICAiTFRTMjNfRlozNF9TMzRfTDAwMSIsIkxUUzIzX0ZaMzRfUzM0X0wwMDIiLA0KICAgICAgICAgICAgICAgICAgICAgICJMVFMyM19GWjM1X1MzNV9MMDAxIiwiTFRTMjNfRlozNV9TMzVfTDAwMiIsDQogICAgICAgICAgICAgICAgICAgICAgIkxUUzIzX0ZaMzZfUzM2X0wwMDEiLCJMVFMyM19GWjM2X1MzNl9MMDAyIiwNCiAgICAgICAgICAgICAgICAgICAgICAiTFRTMjNfRlozN19TMzdfTDAwMSIsIkxUUzIzX0ZaMzdfUzM3X0wwMDIiLA0KICAgICAgICAgICAgICAgICAgICAgICJMVFMyM19GWjM4X1MzOF9MMDAxIiwiTFRTMjNfRlozOF9TMzhfTDAwMiIsDQogICAgICAgICAgICAgICAgICAgICAgIkxUUzIzX0ZaMzlfUzM5X0wwMDEiLCJMVFMyM19GWjM5X1MzOV9MMDAyIiwNCiAgICAgICAgICAgICAgICAgICAgICAiTFRTMjNfRlo0MF9TNDBfTDAwMSIsIkxUUzIzX0ZaNDBfUzQwX0wwMDIiLA0KICAgICAgICAgICAgICAgICAgICAgICJMVFMyM19GWjQxX1M0MV9MMDAxIiwiTFRTMjNfRlo0MV9TNDFfTDAwMiIsDQogICAgICAgICAgICAgICAgICAgICAgIkxUUzIzX0ZaNDJfUzQyX0wwMDEiLCJMVFMyM19GWjQyX1M0Ml9MMDAyIiwNCiAgICAgICAgICAgICAgICAgICAgICAiTFRTMjNfRlo0M19TNDNfTDAwMSIsIkxUUzIzX0ZaNDNfUzQzX0wwMDIiLA0KICAgICAgICAgICAgICAgICAgICAgICJMVFMyM19GWjQ0X1M0NF9MMDAxIiwiTFRTMjNfRlo0NF9TNDRfTDAwMiIsDQogICAgICAgICAgICAgICAgICAgICAgIkxUUzIzX0ZaNDVfUzQ1X0wwMDEiLCJMVFMyM19GWjQ1X1M0NV9MMDAyIiwNCiAgICAgICAgICAgICAgICAgICAgICAiTFRTMjNfRlo0Nl9TNDZfTDAwMSIsIkxUUzIzX0ZaNDZfUzQ2X0wwMDIiLA0KICAgICAgICAgICAgICAgICAgICAgICJMVFMyM19GWjQ3X1M0N19MMDAxIiwiTFRTMjNfRlo0N19TNDdfTDAwMiIsDQogICAgICAgICAgICAgICAgICAgICAgIkxUUzIzX0ZaNDhfUzQ4X0wwMDEiLCJMVFMyM19GWjQ4X1M0OF9MMDAyIiwNCiAgICAgICAgICAgICAgICAgICAgICAiTFRTMjNfRlo0OV9TNDlfTDAwMSIsIkxUUzIzX0ZaNDlfUzQ5X0wwMDIiLA0KICAgICAgICAgICAgICAgICAgICAgICJMVFMyM19GWjUwX1M1MF9MMDAxIiwiTFRTMjNfRlo1MF9TNTBfTDAwMiIpDQpzYW1wbGVzJGxpYl9pZCA8LSBzdWJzdHIoc2FtcGxlcyRmaWxlbmFtZSwgMSwgMTApDQpzYW1wbGVzJGxhbmUgPC0gcmVwKGMoIjEiLCIyIiksIDI1KQ0KDQojY3JlYXRlIHRoZSBjb2x1bW4gd2l0aCB0aGUgdHJlYXRtZW50IGluZm9ybWF0aW9uIGFuZCBzZXQgdGhlIGxldmVscw0Kc2FtcGxlcyR0cmVhdG1lbnQgPC0gYyhyZXAoIkRNU08iLCAyMCksIHJlcCgiVDNJT1AiLCAyMCksIHJlcCgiTVBJIiwgMjApLCByZXAoIkNQRiIsIDIwKSwgcmVwKCJDUEYuVDNJT1AiLCAyMCkpDQpzYW1wbGVzJHRyZWF0bWVudCA8LSBhcy5mYWN0b3Ioc2FtcGxlcyR0cmVhdG1lbnQpDQpzYW1wbGVzJHRyZWF0bWVuIDwtIGZhY3RvcihzYW1wbGVzJHRyZWF0bWVuLCBsZXZlbHMgPSBjKCJETVNPIiwgIlQzSU9QIiwgIk1QSSIsICJDUEYiLCAiQ1BGLlQzSU9QIikpDQoNCnNhbXBsZXMkbGFydmEgPC0gcmVwKHNlcSgxOjEwKSwgNSwgZWFjaD0yKQ0KDQpzYW1wbGVzJGxhYmVsIDwtIHBhc3RlKHNhbXBsZXMkdHJlYXRtZW50LCBzYW1wbGVzJGxhcnZhLCBzZXAgPSAiXyIpDQpzYW1wbGVzJGxhYmVsIDwtIHBhc3RlKHNhbXBsZXMkbGFiZWwsIHNhbXBsZXMkbGFuZSxzZXAgPSAiX0wwMCIpDQoNCiNhZGQgdGhlIGNvbHVtbiB3aXRoIHRoZSBvcmlnaW5hbCBpZCBmcm9tIHRoZSBsYXJ2YWUsIHRvIGJlIGFibGUgdG8gbGluayB0byBleGFjdCBwaWN0dXJlDQpzYW1wbGVzJG9yaWdpbmFsX2xhcnZhbF9pZCA8LSByZXAoYygxLCAyLCAzLCA2LCA3LCA4LCA5LCAxMCwgMTEsIDEyLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCAyLCAzLCA0LCA4LCA5LCAxMCwgMTEsIDEzLCAxNCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDEwLCAxMSwgMTIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCAzLCA0LCA4LCA5LCAxMCwgMTEsIDEzLCAxNCwgMTUpLCBlYWNoPTIpDQpzYW1wbGVzJG9yaWdpbmFsX2xhcnZhbF9pZCA8LSBhcy5jaGFyYWN0ZXIoc2FtcGxlcyRvcmlnaW5hbF9sYXJ2YWxfaWQpDQojcmVtb3ZlIHRoZSBjb2x1bW4gImxhcnZhIg0Kc2FtcGxlcyA8LSBzYW1wbGVzWywgYygxOjYpXQ0KDQpzYW1wbGVzDQpgYGANCg0KYGBge3IsIGVjaG89RkFMU0V9DQpvcmRlcmVkX2xldmVscyA8LSBzYW1wbGVzJGxhYmVsDQpgYGANCg0KYGBge3IsIGVjaG89RkFMU0UsIGluY2x1ZGU9RkFMU0V9DQpmaWxlcyA8LSBmaWxlLnBhdGgoIlo6Ly8wNV9PSVNUX2RhdGEvTWF0aGlldS8wM19zYWxtb25fcXVhbnRpZmljYXRpb25fR0NGMDIyNTM5NTk1IiwNCiAgICAgICAgICAgICAgICAgICBwYXN0ZTAoc2FtcGxlcyRmaWxlbmFtZSwgIl90cmFuc2NyaXB0c1F1YW50aWZpY2F0aW9uIiksICJxdWFudC5zZiIpDQpuYW1lcyhmaWxlcykgPC0gc2FtcGxlcyRsYWJlbA0KDQojY2hlY2sgdGhhdCBhbGwgdGhlIGZvbGRlcnMgaGF2ZSBhIHF1YW50IGZpbGUgaW5zaWRlDQphbGwoZmlsZS5leGlzdHMoZmlsZXMpKQ0KI3ByaW50IGxpc3Qgb2YgZmlsZXMNCmFzLmRhdGEuZnJhbWUoZmlsZXMpDQpgYGANCg0KDQo8YnIvPg0KX19TdGVwIDI6X18gd2Ugd2lsbCB0YWtlIHRoZSBjaGFuY2UgaGVyZSB0byBjcmVhdGUgYW5vdGhlciBxdWFsaXR5IGNvbnRyb2wgc3RlcDogdGhlIG51bWJlciBvciByZWFkcyBwcm9jZXNzZWQgYW5kIHRoZSBudW1iZXIgKyBwZXJjZW50YWdlIG9mIHRob3NlIHJlYWRzIHRoYXQgY291bGQgYmUgbWFwcGVkIGJ5IHNhbG1vbi4gDQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KI1RoaXMgaW5mb3JtYXRpb24gaXMgc3RvcmVkIGluIHRoZSAvYXV4X2luZm8gZm9sZGVyIG9mIGVhY2ggc2FsbW9uIHF1YW50IGZvbGRlciwgZmlsZSAibWV0YV9pbmZvLmpzb24iDQoNCmZpbGVzX21ldGEgPC0gZmlsZS5wYXRoKCJaOi8vMDVfT0lTVF9kYXRhL01hdGhpZXUvMDNfc2FsbW9uX3F1YW50aWZpY2F0aW9uX0dDRjAyMjUzOTU5NSIsDQogICAgICAgICAgICAgICAgICAgcGFzdGUwKHNhbXBsZXMkZmlsZW5hbWUsICJfdHJhbnNjcmlwdHNRdWFudGlmaWNhdGlvbiIpLCAiYXV4X2luZm8vbWV0YV9pbmZvLmpzb24iKQ0KbmFtZXMoZmlsZXNfbWV0YSkgPC0gc2FtcGxlcyRsYWJlbA0KDQojY2hlY2sgdGhhdCBhbGwgdGhlIGZvbGRlcnMgaGF2ZSBhIHF1YW50IGZpbGUgaW5zaWRlDQojYWxsKGZpbGUuZXhpc3RzKGZpbGVzX21ldGEpKQ0KI3ByaW50IGxpc3Qgb2YgZmlsZXMNCiNhcy5kYXRhLmZyYW1lKGZpbGVzX21ldGEpDQoNCg0KIyMgYWZ0ZXIgaGF2aW5nIG1hZGUgc3VyZSB0aGF0IGFsbCBqc29uIGZpbGVzIGV4aXN0LCBsb2FkIHRoZW0gaW50byBSc3R1ZGlvDQoNCnRvdGFsX3JlYWRzIDwtIGxzKCkNCm1hcHBlZF9yZWFkcyA8LSBscygpDQpmb3IgKGkgaW4gc2VxKDE6bGVuZ3RoKGZpbGVzX21ldGEpKSkgew0KICB0b3RhbF9yZWFkc1tpXSA8LSBmcm9tSlNPTihmaWxlc19tZXRhW2ldLCBmbGF0dGVuPVRSVUUpW1sibnVtX3Byb2Nlc3NlZCJdXQ0KICBtYXBwZWRfcmVhZHNbaV0gPC0gZnJvbUpTT04oZmlsZXNfbWV0YVtpXSwgZmxhdHRlbj1UUlVFKVtbIm51bV9tYXBwZWQiXV0NCn0NCg0Kc3VtbWFyeV90YWJsZSA8LSBkYXRhLmZyYW1lKCJ0b3RhbF9yZWFkcyIgPSBhcy5udW1lcmljKHRvdGFsX3JlYWRzKSwgIm1hcHBlZF9yZWFkcyIgPSBhcy5udW1lcmljKG1hcHBlZF9yZWFkcykpDQpzdW1tYXJ5X3RhYmxlJHBlcmNlbnRhZ2VfbWFwcGVkIDwtIHJvdW5kKChzdW1tYXJ5X3RhYmxlJG1hcHBlZF9yZWFkcyAvIHN1bW1hcnlfdGFibGUkdG90YWxfcmVhZHMpKjEwMCwgZGlnaXRzID0gMikNCnN1bW1hcnlfdGFibGUkc2FtcGxlIDwtIHNhbXBsZXMkbGFiZWwNCnN1bW1hcnlfdGFibGUgPC0gc3VtbWFyeV90YWJsZVssIGMoInNhbXBsZSIsICJ0b3RhbF9yZWFkcyIsICJtYXBwZWRfcmVhZHMiLCAicGVyY2VudGFnZV9tYXBwZWQiKV0NCg0KI2thYmxlKHN1bW1hcnlfdGFibGUsIGNhcHRpb24gPSAiU3VtbWFyeSBzdGF0aXN0aWNzIGZvciB0aGUgbWFwcGluZyBvZiBlYWNoIHNhbXBsZSAoQW9jZSBnZW5vbWU6IEFTTTIyNTM5NTl2MSkiKQ0KDQpjdXN0b21SYW5nZSA9IGMoMCwgMTAwKSAjIGN1c3RvbSBtaW4gLyBtYXggdmFsdWVzDQpjb2xvcnMgICAgICA9IGNzc2NvbG9yKGdyYWRpZW50KGFzLm51bWVyaWMoYyhjdXN0b21SYW5nZSwgc3VtbWFyeV90YWJsZSRwZXJjZW50YWdlX21hcHBlZCkpLCAib3JhbmdlIiwgIiM3MUNBOTciKSkNCmNvbG9ycyAgICAgID0gY29sb3JzWy0oMToyKV0gIyMgcmVtb3ZlIGNvbG9ycyBmb3IgbWluL21heA0KDQpmbXQgICAgPSBmb3JtYXR0ZXIoInNwYW4iLCANCiAgICAgICAgICAgICAgICAgICBzdHlsZSA9IGZ1bmN0aW9uKHgpew0KICAgICAgICAgICAgICAgICAgICAgc3R5bGUoZGlzcGxheSAgICAgICAgICAgID0gImJsb2NrIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZGRpbmcgICAgICAgICAgICA9ICIwIDRweCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBgYm9yZGVyLXJhZGl1c2AgICAgPSAiNHB4IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGBiYWNrZ3JvdW5kLWNvbG9yYCA9IGNvbG9ycw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgKX0pDQoNCg0KZm9ybWF0dGFibGUoc3VtbWFyeV90YWJsZSwgDQogICAgICAgICAgICAgY2FwdGlvbiA9IlN1bW1hcnkgc3RhdGlzdGljcyBmb3IgdGhlIG1hcHBpbmcgb2YgZWFjaCBzYW1wbGUgKEFvY2UgZ2Vub21lOiBBU00yMjUzOTU5djEpIiwNCiAgICAgICAgICAgIGFsaWduID1jKCJsIiwiYyIsICJjIiwgImMiKSwgDQogICAgICAgICAgICBsaXN0KGBzYW1wbGVgID0gZm9ybWF0dGVyKCJzcGFuIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlID0geCB+IHN0eWxlKA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICNjb2xvciA9ICBpZmVsc2UoeCA9PSBzdW1tYXJ5X3RhYmxlW3N1bW1hcnlfdGFibGUkcGVyY2VudGFnZV9tYXBwZWQgPT0gbWF4KHN1bW1hcnlfdGFibGUkcGVyY2VudGFnZV9tYXBwZWQpLCJzYW1wbGUiXSwgIiM3MUNBOTciLCBpZmVsc2UoeCA9PSBzdW1tYXJ5X3RhYmxlW3N1bW1hcnlfdGFibGUkcGVyY2VudGFnZV9tYXBwZWQgPT0gbWluKHN1bW1hcnlfdGFibGUkcGVyY2VudGFnZV9tYXBwZWQpLCJzYW1wbGUiXSwgImxpZ2h0Y29yYWwiLCAiZ3JheSIpKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvciA9IHJlcChjKCIjQTlBOUE5IiwiIzdDQ0Q3QyIsImxpZ2h0Y29yYWwiLCAibGlnaHRza3libHVlIiwgIiNFRTdBRTkiKSwNCiAgICAgICAgICAgICAgICAgIGVhY2g9MjApLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250LndlaWdodCA9ICJib2xkIiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHggfiBpY29udGV4dChpZmVsc2UoeCA9PSBzdW1tYXJ5X3RhYmxlW3N1bW1hcnlfdGFibGUkbWFwcGVkX3JlYWRzID09IG1heChzdW1tYXJ5X3RhYmxlJG1hcHBlZF9yZWFkcyksInNhbXBsZSJdLCAic3RhciIsIGlmZWxzZSh4ID09IHN1bW1hcnlfdGFibGVbc3VtbWFyeV90YWJsZSRtYXBwZWRfcmVhZHMgPT0gbWluKHN1bW1hcnlfdGFibGUkbWFwcGVkX3JlYWRzKSwic2FtcGxlIl0sICJzdGFyLWVtcHR5IiwgIiIpKSwgeCkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSwgDQogICAgICAgICAgICAgICAgIGB0b3RhbF9yZWFkc2A9IGNvbG9yX3RpbGUoIm9yYW5nZSIsICIjNzFDQTk3IiksDQogICAgICAgICAgICAgICAgICNgbWFwcGVkX3JlYWRzYD0gY29sb3JfdGlsZSgib3JhbmdlIiwgIiM3MUNBOTciKSwNCiAgICAgICAgICAgICAgICAgYG1hcHBlZF9yZWFkc2A9IGZtdCwNCiAgICAgICAgICAgICAgICAgI2BwZXJjZW50YWdlX21hcHBlZGA9IGNvbG9yX3RpbGUoTkEsICIjNzFDQTk3IikNCiAgICAgICAgICAgICAgICAgYHBlcmNlbnRhZ2VfbWFwcGVkYD0gZm10DQoNCiAgICAgICAgICAgICAgICAgKQ0KICAgICAgICAgICAgKQ0KDQpgYGANCg0KDQpgYGB7ciwgZWNobz1GQUxTRX0NCnBhc3RlKCJFeHBlY3RlZCBudW1iZXIgb2YgdG90YWwgcmVhZHMvbGFuZSAoUDNjZWxsKTogIiwgMTQwMC9ucm93KHN1bW1hcnlfdGFibGUpLCAibWlsbGlvbnMiKQ0KcGFzdGUoIk1lZGlhbiBudW1iZXIgb2YgdG90YWwgcmVhZHMvbGFuZTogIiwgcm91bmQobWVkaWFuKHN1bW1hcnlfdGFibGUkdG90YWxfcmVhZHMpLzEwMDAwMDAsIGRpZ2l0cyA9IDIpICwgIm1pbGxpb25zIikNCnBhc3RlKCJNZWRpYW4gbnVtYmVyIG9mIG1hcHBlZCByZWFkcy9sYW5lOiAiLCByb3VuZChtZWRpYW4oc3VtbWFyeV90YWJsZSRtYXBwZWRfcmVhZHMpLzEwMDAwMDAsIGRpZ2l0cyA9IDIpLCAibWlsbGlvbnMiKQ0KcGFzdGUoIkF2ZXJhZ2UgbWFwcGluZyBwZXJjZW50YWdlL2xhbmU6ICIsIHJvdW5kKG1lYW4oc3VtbWFyeV90YWJsZSRwZXJjZW50YWdlX21hcHBlZCksIGRpZ2l0cz0yKSwgIiUiKQ0KYGBgDQoNCjxici8+DQpfX1N0ZXAgMzpfXyBUcmFuc2NyaXB0cyBuZWVkIHRvIGJlIGFzc29jaWF0ZWQgd2l0aCBnZW5lIElEcyBmb3IgZ2VuZS1sZXZlbCBzdW1tYXJpemF0aW9uLiBGb3IgU2FsbW9uLCBTYWlsZmlzaCwgYW5kIGthbGxpc3RvIHRoZSBmaWxlcyBvbmx5IHByb3ZpZGUgdGhlIHRyYW5zY3JpcHQgSUQuIFdlIGZpcnN0IG1ha2UgYSBkYXRhLmZyYW1lIGNhbGxlZCB0eDJnZW5lIHdpdGggdHdvIGNvbHVtbnM6IDEpIHRyYW5zY3JpcHQgSUQgYW5kIDIpIGdlbmUgSUQuIFRoZSBjb2x1bW4gbmFtZXMgZG8gbm90IG1hdHRlciBidXQgdGhpcyBjb2x1bW4gb3JkZXIgbXVzdCBiZSB1c2VkLiBUaGUgdHJhbnNjcmlwdCBJRCBtdXN0IGJlIHRoZSBzYW1lIG9uZSB1c2VkIGluIHRoZSBhYnVuZGFuY2UgZmlsZXMuDQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KI0kgYW0gdXNpbmcgYSBOQ0JJIGdlbm9tZQ0KDQp0eGRiIDwtIG1ha2VUeERiRnJvbUdGRiggZmlsZSA9ICJZOi8vYnVsa1JOQXNlcS9HQ0ZfMDIyNTM5NTk1LjEvZ2Vub21pYy5nZmYiLCBmb3JtYXQgPSAiZ2ZmIiAsIA0KICAgICAgICAgICAgICAgICAgICAgICAgIGRieHJlZlRhZyA9ICJHZW5lSUQiICNhZGRpbmcgdGhpcyB0YWcgbWVhbnMgdGhhdCB0aGUgbmFtZSBvZiB0aGUgZ2VuZXMgd2lsbCBiZSB0aGVpciBOQ0JJIGNvZGUsIHJhdGhlciB0aGFuIHRoZSBzeW1ib2wNCiAgICAgICAgICAgICAgICAgICAgICAgICApDQpjb2x1bW5zKHR4ZGIpDQoNCmsgPC0gYmlvbWFSdDo6a2V5cyh0eGRiLCBrZXl0eXBlID0gIlRYTkFNRSIgKQ0KdHgyZ2VuZSA8LSBiaW9tYVJ0OjpzZWxlY3QoIHR4ZGIsIGssICJHRU5FSUQiLCAiVFhOQU1FIiApDQoNCiN0aGUgZmlyc3Qgcm93IGlzIE5BIGZvciBzb21lIHJlYXNvbg0KdHgyZ2VuZSA8LSB0eDJnZW5lWy0xLF0NCiNJIGFsc28gbmVlZCB0byByZW1vdmUgdGhlIHRyYW5zY3JpcHQgdmVyc2lvbiBudW1iZXINCnR4MmdlbmUkVFhOQU1FIDwtIGdzdWIoIlxcLi4qIiwiIix0eDJnZW5lJFRYTkFNRSkNCiN3ZSBhbHNvIG5lZWQgdG8gcmVtb3ZlIHRoZSAiR2VuZUlEOiIgYmVmb3JlIGV2ZXJ5IE5DQkkgY29kZSBpbiB0aGUgZ2VuZSBuYW1lDQp0eDJnZW5lJEdFTkVJRCA8LSBnc3ViKCIuKjoiLCIiLHR4MmdlbmUkR0VORUlEKQ0KDQpoZWFkKHR4MmdlbmUpDQpgYGANCg0KU2FsbW9uIG91dHB1dCB0cmFuc2NyaXB0LWJhc2VkIHF1YW50aWZpY2F0aW9uIGZpbGVzIChxdWFudC5zZikgYXJlIGltcG9ydGVkIGluIFJTdHVkaW8gYW5kIHN1bW1hcmlzZWQgYXQgdGhlIGdlbmUgbGV2ZWwgdXNpbmcgdGhlIHR4aW1wb3J0IGZ1bmN0aW9uIGZyb20gdGhlIHR4aW1wb3J0IHBhY2thZ2UgKFJSSUQ6U0NSXzAxNjc1MjsgU29uZXNvbiBldCBhbC4sIDIwMTUpLCByZWZlcmVuY2luZyB0aGUgZ2VuZSBtb2RlbHMgb2YgQW1waGlwcmlvbiBvY2VsbGFyaXMgcmVmZXJlbmNlIGdlbm9tZSBhc3NlbWJseSBBU00yMjUzOTU5djEuIFRoZSBjb3VudHMgbWF0cml4IGlzIG9idGFpbmVkIGJ5IHJlLWNhbGN1bGF0aW5nIGNvdW50cyB0aHJvdWdoIHRoZSBmbGFnIGNvdW50c0Zyb21BYnVuZGFuY2UgPSAibGVuZ3RoU2NhbGVkVFBNIi4NCg0KYGBge3IsIGVjaG89RkFMU0V9DQp0eGkgPC0gdHhpbXBvcnQoZmlsZXMsIHR5cGUgPSAic2FsbW9uIiwgDQogICAgICAgICAgICAgICAgdHgyZ2VuZSA9IHR4MmdlbmUsIA0KICAgICAgICAgICAgICAgIGlnbm9yZVR4VmVyc2lvbiA9IFRSVUUsICANCiAgICAgICAgICAgICAgICBjb3VudHNGcm9tQWJ1bmRhbmNlID0gImxlbmd0aFNjYWxlZFRQTSIpDQpgYGANCkdpdmluZyB0aGUgZm9sbG93aW5nIGNvdW50IG1hdHJpeCAoZmlyc3Qgcm93cyBvbmx5LCBzaG93biBoZXJlKQ0KDQpgYGB7ciwgZWNobz1GQUxTRX0NCmhlYWQodHhpJGNvdW50cykNCmBgYA0KDQojIyMjIyBBc2VtYmxpbmcgdGhlIERHRSBvYmplY3QNCg0KPGJyLz4NCl9fU3RlcCAxOl9fIFdlIGZpcnN0IGNvbGxlY3QgdGhlIGZpbGUgd2l0aCB0aGUgc2FtcGxlIG1ldGFkYXRhIChhcyBjcmVhdGVkIGVhcmxpZXIpDQoNCmBgYHtyLCBpbmNsdWRlPVRSVUUsIGV2YWw9VFJVRSwgZWNobz1GQUxTRX0NCiMjIGNyZWF0ZSBhIG5ldyBmaWxlIGNhbGxlZCAic2FtcGxlIGluZm8iDQpzYW1wbGVfaW5mbyA8LSBzYW1wbGVzDQoNCiNzaG93IG91ciBmaW5hbCAic2FtcGxlIGluZm8iIGZpbGUNCnNhbXBsZV9pbmZvDQpgYGANCg0KPGJyLz4NCl9fU3RlcCAyOl9fIFdlIHRoZW4gY29sbGVjdCB0aGUgY291bnRzIG1hdHJpeCBhcyBpbXBvcnRlZCBmcm9tIFNhbG1vbiB3aXRoIHR4aW1wb3J0DQoNCmBgYHtyLCBpbmNsdWRlPVRSVUUsIGVjaG89RkFMU0V9DQojIyBMZXTigJlzIGNyZWF0ZSBhIG5ldyBkYXRhIG9iamVjdCwgImNvdW50cyIsIHRoYXQgY29udGFpbnMgb25seSB0aGUgY291bnRzIGZvciB0aGUgOSBzYW1wbGVzLg0KIyBGcm9tIHRoZSBvcmlnaW5hbCByYXcgY291bnRzIGZpbGUsIHJlbW92ZSBjb2x1bW5zIDIgdG8gOSANCiMgKHRoaXMgd2lsbCBjcmVhdGUgYSB0YWJsZSB3aXRoIG9ubHkgdGhlIGVtc2VtYmxlSUQgYW5kIHRoZSBjb3VudCBjb2x1bW5zIG9mIGVhY2ggc2FtcGxlKQ0KY291bnRzIDwtIGFzLmRhdGEuZnJhbWUodHhpJGNvdW50cykNCg0KI3Nob3cgb3VyIGZpbmFsICJjb3VudHMiIGZpbGUNCmhlYWQoY291bnRzKQ0KDQojcmVtb3ZlIHVudXNlZCB2YXJpYWJsZXMNCnJtKHNhbXBsZXMsIHR4MmdlbmUsIHR4aSwgZmlsZXMpDQpgYGANCg0KPGJyLz4NCl9fU3RlcCAzOl9fIE5vdywgd2UgY2FuIGNyZWF0ZSBhIERHRUxpc3Qgb2JqZWN0LiBUaGlzIGlzIGFuIG9iamVjdCB1c2VkIGJ5IGVkZ2VSIHRvIHN0b3JlIGNvdW50IGRhdGEuIEl0IGhhcyBhIG51bWJlciBvZiBzbG90cyBmb3Igc3RvcmluZyB2YXJpb3VzIHBhcmFtZXRlcnMgYWJvdXQgdGhlIGRhdGEuDQoNCmBgYHtyLCBlY2hvPUZBTFNFLCByZXN1bHRzPSdoaWRlJ30NCiMjIGNyZWF0ZSB0aGUgbmV3IERHRSBvYmplY3QNCkRHRV9vYmplY3QgPC0gREdFTGlzdChjb3VudHMsICNsb2FkIHRoZSByYXcgY291bnRzIG1hdHJpeA0KICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZXM9c2FtcGxlX2luZm8gI2tlZXAgc2FtcGxlIGFzIGxhc3QgY29sdW1uICNsb2FkIHRoZSBjb21wbGVtZW50YXJ5IGluZm8gKG1ha2Ugc3VyZSB5b3UgYXJlIGluY2x1ZGluZyBhbGwgdGhlIHBvc3NpYmxlIHNvdXJjZXMgb2YgdGVjaG5pY2FsIHZhcmlhdGlvbiB0aGF0IGNvdWxkIGNsdXN0ZXIgc2FtcGxlcyBpbnN0ZWFkIG9mIHRoZSBnZW5lcykNCiAgICAgICAgICAgICAgICAgICAgICApDQojIFRoZSBkYXRhIGhhcyBiZWVuIGltcG9ydGVkLCBhbmQgdGhlIG9iamVjdHMgY2FsY3VsYXRlZCBsaWJyYXJ5IHNpemUgaW5mby4gDQojIFNob3cgdGhlIGluZm9ybWF0aW9uIHN0b3JlZCBpbiB0aGUgInNhbXBsZXMiIERHRW9iamVjdCBzbG90DQpER0Vfb2JqZWN0JHNhbXBsZXMgI2Fsc28gYWNjZXNzaWJsZSB0aHJvdWdoIHlbWyJzYW1wbGVzIl1dDQoNCiMjcmVtb3ZlIHVudXNlZCB2YXJpYWJsZXMNCnJtKHNhbXBsZV9pbmZvKQ0KYGBgDQoNCg0KYGBge3IsIGVjaG89RkFMU0V9DQojIyBEbyBzb21lIHJlYXJyYW5nZW1lbnQgYW5kIGNsZWFudXAgb2YgdGhlIGluZm9ybWF0aW9uIHdlIGhhdmUgbG9hZGVkIGluIHRoZSBER0Ugb2JqZWN0ICJzYW1wbGVzIiBzbG90DQojIFRvIGZhY2lsaXRhdGUgd29ya2luZyBvbiB0aGUgInNhbXBsZXMiIHNsb3QsIHdlIHdpbGwgZXh0cmFjdCBpdCBhbmQgd29yayBvbiBpdCBhcyBhIHNlcGFyYXRlIGRhdGFmcmFtZQ0KdGVtcG9yYXJ5X3NhbXBsZXNfc2xvdCA8LSBER0Vfb2JqZWN0W1sic2FtcGxlcyJdXQ0KDQojIGNyZWF0aW5nIHRoZSBER0VvYmplY3QgYWRkZWQgYSAiZ3JvdXAiIGNvbHVtbiBieSBkZWZhdWx0DQojIHJlcGxhY2UgdGhlICNncm91cCIgdmFsdWVzIHdpdGggdGhlIHNhbXBsZSBpbmZvcm1hdGlvbiAoaS5lLiB3ZSB3aWxsIGdyb3VwIGFzIEMwMSwgQzAyLCBldGMuLikNCiMgY29udmVydCB0aGUgImdyb3VwIiBjb2x1bW4gdG8gbnVtZXJpYyBkYXRhdHlwZSANCnRlbXBvcmFyeV9zYW1wbGVzX3Nsb3QkZ3JvdXAgPC0gYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIodGVtcG9yYXJ5X3NhbXBsZXNfc2xvdCRncm91cCkpDQojbGV0cyByZXBsYWNlIHRoZSBkZWZhdWx0IHZhbHVlcyB3aXRoIHdoYXQgd2Ugd2FudCAoQzAxLCBDMDIsIGV0Yy4uIDogdGhlIHNhbXBsZSBuYW1lcykNCmZvciAoaSBpbiAxOmxlbmd0aChyb3duYW1lcyh0ZW1wb3Jhcnlfc2FtcGxlc19zbG90KSkpIHsNCiAgdGVtcG9yYXJ5X3NhbXBsZXNfc2xvdFtpLCJncm91cCJdIDwtICMgdGhlICJncm91cCIgdmFsdWUgYXQgZWFjaCByb3cgaXMuLi4NCiAgICAgIHRlbXBvcmFyeV9zYW1wbGVzX3Nsb3RbaSwibGFiZWwiXSAjIHRoZSB2YWx1ZSBvZiB0aGUgInNhbXBsZSBjb2x1bW4iDQp9ICANCiMgcmVzdG9yZSB0aGUgImdyb3VwIiBjb2x1bW4gdG8gYSBmYWN0b3IgZGF0YXR5cGUNCnRlbXBvcmFyeV9zYW1wbGVzX3Nsb3QkZ3JvdXAgPC0gYXMuZmFjdG9yKHRlbXBvcmFyeV9zYW1wbGVzX3Nsb3QkZ3JvdXApDQojIGNsZWFudXAgY29sdW1ucyAod2UgZG8gbm90IG5lZWQgdGhlICJzYW1wbGUiIGNvbHVtbiBhbnltb3JlKQ0KdGVtcG9yYXJ5X3NhbXBsZXNfc2xvdCA8LSB0ZW1wb3Jhcnlfc2FtcGxlc19zbG90WywtbGVuZ3RoKHRlbXBvcmFyeV9zYW1wbGVzX3Nsb3QpXSAjaS5lLiByZW1vdmUgbGFzdCBjb2x1bW4NCiMgcmVvcmRlciBjb2x1bW5zDQp0ZW1wb3Jhcnlfc2FtcGxlc19zbG90IDwtIGRwbHlyOjpzZWxlY3QodGVtcG9yYXJ5X3NhbXBsZXNfc2xvdCwgImdyb3VwIiwgInRyZWF0bWVudCIsICJsYW5lIiwgIm9yaWdpbmFsX2xhcnZhbF9pZCIsICJsaWJfaWQiLCJsaWIuc2l6ZSIsICJub3JtLmZhY3RvcnMiKQ0KDQojIyBQdXQgYmFjayB1cGRhdGVkIHNhbXBsZSBzbG90IGludG8gREdFIG9iamVjdA0KREdFX29iamVjdFtbInNhbXBsZXMiXV0gPC0gdGVtcG9yYXJ5X3NhbXBsZXNfc2xvdA0KDQojIHJlbW92ZWQgdW51c2VkIHZhcmlhYmxlcw0Kcm0odGVtcG9yYXJ5X3NhbXBsZXNfc2xvdCwgaSkNCg0KI3Nob3cgdGhlIGZpbmFsICJzYW1wbGVzIiBzbG90IG9mIG91ciBER0VvYmplY3QNCkRHRV9vYmplY3RbWyJzYW1wbGVzIl1dDQoNCiNzYXZlIHRoaXMgdXBkYXRlZCBzYW1wbGUgbWV0YWRhdGEgZm9yIGxhdGVyDQpzYW1wbGVfbWV0YWRhdGEgPC0gREdFX29iamVjdFtbInNhbXBsZXMiXV0NCmBgYA0KDQpgYGB7ciwgZWNobz1GQUxTRX0NCiNzYXZlIHRoaXMgb2JqZWN0LCBmb3IgbGF0ZXIgc3Vic2V0dGluZw0KI3NhdmUoREdFX29iamVjdCwgZmlsZSA9ICJEOi8vQW9jZWxsYXJpc19DUEZfTVBJX1QzL1NhdmVkX29iamVjdHMvREdFX29iamVjdC5yZHMiKQ0KYGBgDQoNCjxici8+DQpfX1N0ZXAgNDpfXyBXZSB0aGVuIGNvbGxlY3QgdGhlIGxhc3QgbWlzc2luZyBwaWVjZSBvZiBpbmZvcm1hdGlvbiwgdGhlIGdlbmUgbWV0YWRhdGEgaW5mbyAoaW4gdGhpcyBjYXNlLCBpdCBpcyBsb2FkZWQgZnJvbSBhIGN1c3RvbS1jdXJhdGVkIHJlZmVyZW5jZSBmaWxlIGJhc2VkIG9uIHRoZSBpbnRlZ3JhdGlvbiBvZiBFbnNlbWJsIChzdGlsbCBiYXNlZCBvbiBhc3NlbWJseSBBbXBPY2UxLjApIGFuZCBOQ0JJIGFubm90YXRpb25zICkNCg0KYGBge3IsIGVjaG89RkFMU0V9DQpsb2FkKCJEOi8vQW9jZWxsYXJpc19DUEZfTVBJX1QzL1NhdmVkX29iamVjdHMvREdFX29iamVjdC5yZHMiKQ0KYGBgDQoNCg0KYGBge3IsIGVjaG89RkFMU0V9DQojdGhlIHRhYmxlIHdpdGggdGhlIGFubm90YXRpb24gaW5mb3JtYXRpb24gb2YgZWFjaCBnZW5lICh3aXRoIG1hbnVhbCBjdXJhdGlvbiBvZiB0aGUgZGVzY3JpcHRpb24pLCB3YXMgbWFkZSBpbiBhIHNlcGFyYXRlIG5vdGVib29rIChjZnIgIkFvY2VsbGFyaXNfYW5ub3RhdGlvbmluZm9fbWFrZXIuUm1kKSBhbmQgc2F2ZWQgYXMgYSBSIG9iamVjdCB3aGljaCB3ZSB3aWxsIGxvYWQgaGVyZS4gI2Fubm90YXRpb25faW5mb19OQ0JJRW5zZW1ibA0KbG9hZCgiQzovL1VzZXJzL0RvY3Rvci9EZXNrdG9wL1JOQXNlcV9hbmFseXNlcy9hbm5vdGF0aW9uX2luZm9fTkNCSUVuc2VtYmxfY3VyYXRlZC5yZHMiKSANCg0KI3JlbmFtZSB0aGUgZGF0YWZyYW1lIGFzICJhbm5vdGF0aW9uX2luZm8iDQphbm5vdGF0aW9uX2luZm8gPC0gYW5ub3RhdGlvbl9pbmZvX05DQklFbnNlbWJsDQojcmVtb3ZlIHRoZSBjb2x1bW4gd2l0aCB0aGUgb3JpZ2luYWwgZGVzY3JpcHRpb24NCiNhbm5vdGF0aW9uX2luZm8gPC0gc3Vic2V0KGFubm90YXRpb25faW5mbywgc2VsZWN0ID0gLWMob3JpZ2luYWxfZGVzY3JpcHRpb24pKQ0KDQojcmVtb3ZlIHVudXNlZCB2YXJpYWJsZXMNCnJtKGFubm90YXRpb25faW5mb19OQ0JJRW5zZW1ibCkNCmBgYA0KDQoNCmBgYHtyLCBlY2hvPUZBTFNFLCByZXN1bHRzPSdoaWRlJ30NCiNhcmUgdGhlcmUgYW55IE5BIHZhbHVlcyBpbiBlbnRyZXogSURzPw0Kc3VtbWFyeShpcy5uYShhbm5vdGF0aW9uX2luZm8kZW50cmV6X0lEKSkgIzI5MTMwDQoNCiNjaGVjayB0aGF0IHRoZXJlIGFyZSBubyBkdXBsaWNhdGVkIGVudHJleiBJRA0Kc3VtbWFyeShkdXBsaWNhdGVkKGFubm90YXRpb25faW5mbyRlbnRyZXpfSUQpKSAjIG5vIDI5MTMwDQpgYGANCg0KPGJyLz4gd2UgbG9hZGVkIHRoaXMgaW5mb3JtYXRpb24gdG9vIGludG8gdGhlIERHRV9saXN0IG9iamVjdCwgYWZ0ZXIgbWFudWFsIGFubm90YXRpb24gb2Ygc29tZSBnZW5lcywgYW5kIGZpbGxpbmcgaW4gb2YgbWlzc2luZyB2YWx1ZXMuDQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KI3dlIGNhbiBmaW5kIGdlbmVzIHRoYXQgYXJlIHByZXNlbnQgaW4gb3VyIGRhdGFzZXQsIGJ1dCBhcmUgbm90IGluIHRoZSBhbm5vdGF0aW9uIGZpbGUNCm1pc3NpbmdfZ2VuZXMgPC0gcm93bmFtZXMoREdFX29iamVjdCRjb3VudHMpWyhyb3duYW1lcyhER0Vfb2JqZWN0JGNvdW50cykgJWluJSBhbm5vdGF0aW9uX2luZm8kZW50cmV6X0lEKSA9PSBGQUxTRV0NCiNtaXNzaW5nX2dlbmVzDQojIHRoZXJlIGFyZSBubyBnZW5lcyB3aXRoIG1pc3NpbmcgYW5ub3RhdGlvbg0KDQojY2hlY2sgdGhlIHJldmVyc2U6IGhvdyBtYW55IGdlbmVzIGluIHRoZSBhbm5vdGF0aW9uIGFyZSBwcmVzZW50IGluIHRoZSBjb3VudHMgcXVhbnRpZmljYXRpb24NCiMgaG93IG1hbnkgZ2VuZXMgaW4gdGhlIG9iamVjdD8NCmxlbmd0aChyb3duYW1lcyhjb3VudHMpKSAjMjY4ODkgb3V0IG9mIDI5MTMwDQpzdW1tYXJ5KGFubm90YXRpb25faW5mbyRlbnRyZXpfSUQgJWluJSByb3duYW1lcyhjb3VudHMpKSAjeWVzIDI2ODg5IChzYW1lIG51bWJlcik7IHByb3ZpbmcgdGhhdCB0aGVyZSBhcmUgbm8gZXJyb3JzIGluIHRoZSBtZXRhZGF0YSBmaWxlDQojY2hlY2sgdGhhdCB0aGUgb3JkZXIgb2YgdGhlc2UgZ2VuZXMgd2l0aCB0aGUgb3JkZXIgb2YgdGhlIHJvd25hbWVzIG9mIHRoZSBjb3VudCBvYmplY3QNCiN0ZXN0IDwtIGFubm90YXRpb25faW5mb1thbm5vdGF0aW9uX2luZm8kZW50cmV6X0lEICVpbiUgcm93bmFtZXMoY291bnRzKSxdDQojY291bnRzDQoNCiMganVzdCBhcyB3ZSBkaWQgZm9yIHRoZSBjbGVhbmVkIHJhdyBjb3VudHMgbWF0cml4IGRhdGEsIHdlIGNhbiBpbnNlcnQgdGhpcyBhbm5vdGF0aW9uIGRhdGEgaW50byB0aGUgREdFIG9iamVjdA0KI0RHRV9vYmplY3QkZ2VuZXMgPC0gYW5ub3RhdGlvbl9pbmZvICN0aGlzIGNyZWF0ZSBhIG5ldyBzbG90ICgiZ2VuZXMiKSBpbiB0aGUgZGF0YW9iamVjdA0KREdFX29iamVjdCRnZW5lcyA8LSBhbm5vdGF0aW9uX2luZm9bYW5ub3RhdGlvbl9pbmZvJGVudHJlel9JRCAlaW4lIHJvd25hbWVzKGNvdW50cyksXSAjIG9ubHkgY29uc2lkZXIgZ2VuZXMgaW4gY291bnRzDQoNCiMgc2hvdyB0aGlzIG5ldyBzbG90ICJnZW5lcyIgb2YgdGhlIGFubm90YXRpb24gaW5mbw0KREdFX29iamVjdCRnZW5lcw0KYGBgDQoNCiMjIyMgey19IA0KDQojIyMgUXVhbGl0eSBDb250cm9sIGFuZCBGaWx0ZXJpbmcgb2YgbG93bHkgZXhwcmVzc2VkIGdlbmVzDQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KI29yZGVyZWQgYnkgc2VnbWVudCBhbmQgdGhlbiBieSBzdGFnZQ0KY29sb3JfbGlzdCA8LSByZXAoYygiZ3JheTcwIiwicGFsZWdyZWVuMyIsImxpZ2h0Y29yYWwiLCAibGlnaHRza3libHVlIiwgIm9yY2hpZDIiKSwNCiAgICAgICAgICAgICAgICAgIGVhY2g9MjApDQoNCmNvbG9yX2NhdGVnb3JpY2FsX3RyZWF0bWVudDwtYygiZ3JheTcwIiwicGFsZWdyZWVuMyIsImxpZ2h0Y29yYWwiLCAibGlnaHRza3libHVlIiwgIm9yY2hpZDIiKQ0KY29sb3JfY2F0ZWdvcmljYWxfbGFuZTwtIGMoImdyYXkiLCAibGlnaHRjb3JhbCIpDQoNCm9yZGVyZWRfbGV2ZWxzIDwtIERHRV9vYmplY3RbWyJzYW1wbGVzIl1dJGdyb3VwDQpgYGANCg0KIyMjIyMgX19RdWFsaXR5IENvbnRyb2wgb2YgaW1wb3J0ZWQgZGF0YV9fDQpIb3cgaXMgY291bnQgZGF0YSBkaXN0cmlidXRlZD8gbm90IG5vcm1hbGx5LCBhcyBzaG93biBieSB0aGUgcGxvdCBiZWxvdy4gTW9yZW92ZXIsIHRoZSB2YXJpYW5jZSBpcyBiaWdnZXIgdGhhbiB0aGUgbWVhbiwgbWVhbmluZyB0aGF0IGEgbmVnYXRpdmUgYmlub21pYWwsIHJhdGhlciB0aGFuIGEgcG9pc3NvbiwgZGVzY3JpYmVzIGNvdW50IGRhdGEuDQoNCmBgYHtyLCBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFICxmaWcud2lkdGg9MTIsIGZpZy5oZWlnaHQ9OH0NCiNodHRwczovL2hiY3RyYWluaW5nLmdpdGh1Yi5pby9ER0Vfd29ya3Nob3AvbGVzc29ucy8wMV9ER0Vfc2V0dXBfYW5kX292ZXJ2aWV3Lmh0bWwjcm5hLXNlcS1jb3VudC1kaXN0cmlidXRpb24NCg0KDQojZ2V0IHRoZSByYXcgY291bnRzDQpjb3VudHNfcmF3ICA8LSBER0Vfb2JqZWN0JGNvdW50cyAjdGhpcyBpcyB0aGUgc2FtZSBhcyBkb2luZyBjcG0oY291bnRzKSBhbmQgbG9nMiBvZiBpdA0KDQojcHJlcGFyZSBmb3IgZ2dwbG90DQojbWFrZSBnZW5lIGNvZGVzIGFzIGNvbHVtbnMNCmNvdW50c19yYXcgPC0gYXMuZGF0YS5mcmFtZShjb3VudHNfcmF3KQ0KY291bnRzX3JhdyA8LSBjYmluZChlbnNlbWJsX2lkID0gcm93bmFtZXMoY291bnRzX3JhdyksIGNvdW50c19yYXcpDQoNCmNvdW50c19yYXcgPC0gY291bnRzX3JhdyAlPiUgDQogIHBpdm90X2xvbmdlcigNCiAgICBjb2xzID0gIWVuc2VtYmxfaWQsIA0KICAgIG5hbWVzX3RvID0gInNhbXBsZSIsIA0KICAgIHZhbHVlc190byA9ICJjb3VudCINCiAgKQ0KDQojcGxvdA0KcGxvdDEgPC0gZ2dwbG90KGNvdW50c19yYXcsIGFlcyh4PWNvdW50KSkgKw0KICBnZW9tX2hpc3RvZ3JhbShzdGF0ID0gImJpbiIsIGJpbnMgPSAxMDAwLCBmaWxsPSJkb2RnZXJibHVlIikgKw0KICB4bGFiKCJyYXcgY291bnRzIikgKw0KICB5bGFiKCJudW1iZXIgb2YgZ2VuZXMgXG4gd2l0aCBnaXZlbiBleHByZXNzaW9uIikrDQogIGdndGl0bGUoImRpc3RyaWJ1dGlvbiBvZiByYXcgY291bnRzIikrDQogICN5bGltKDAsMjAwMDApKw0KICB0aGVtZV9idygpKw0KICAjdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSsNCiAgTlVMTA0KDQpwbG90MyA8LSBnZ3Bsb3QoY291bnRzX3JhdywgYWVzKHg9Y291bnQpKSArDQogIGdlb21faGlzdG9ncmFtKHN0YXQgPSAiYmluIiwgYmlucyA9IDUwMDAsIGZpbGw9ImRvZGdlcmJsdWUiKSArDQogIHhsYWIoInJhdyBjb3VudHMiKSArDQogIHlsYWIoIm51bWJlciBvZiBnZW5lcyBcbiB3aXRoIGdpdmVuIGV4cHJlc3Npb24iKSsNCiAgZ2d0aXRsZSgiZGlzdHJpYnV0aW9uIG9mIHJhdyBjb3VudHMiLCBzdWJ0aXRsZSA9ICJtb3N0IGdlbmVzIGhhdmUgZmV3IGNvdW50cyIpKw0KICB0aGVtZV9idygpKw0KICBmYWNldF96b29tKHhsaW0gPSBjKDAsIDEwMDAwKSwgeWxpbSA9IGMoMCwgMTAwMCkpKw0KICAjdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSsNCiAgTlVMTA0KDQpwbG90NDwtIGdncGxvdChjb3VudHNfcmF3LCBhZXMoeD1jb3VudCkpICsNCiAgZ2VvbV9oaXN0b2dyYW0oc3RhdCA9ICJiaW4iLCBiaW5zID0gNTAwMCwgZmlsbD0iZG9kZ2VyYmx1ZSIpICsNCiAgeGxhYigicmF3IGNvdW50cyIpICsNCiAgeWxhYigibnVtYmVyIG9mIGdlbmVzIFxuIHdpdGggZ2l2ZW4gZXhwcmVzc2lvbiIpKw0KICBnZ3RpdGxlKCJkaXN0cmlidXRpb24gb2YgcmF3IGNvdW50cyIsIHN1YnRpdGxlID0gInZlcnkgZmV3IGdlbmVzIGhhdmUgaGlnaCBjb3VudHMiKSsNCiAgdGhlbWVfYncoKSsNCiAgZmFjZXRfem9vbSh5bGltID0gYygwLCA1KSkrDQogICN0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpKw0KICBOVUxMDQoNCiMjIGEgcG9pc3NvbiBkaXN0cmlidXRpb24gc2hvdWxkIGFwcHJveGltYXRlIHJuYSBleHByZXNzaW9uIGRhdGEsIGhvd2V2ZXIsIHZhcmlhdGlvbiBiZXR3ZWVuIHNhbXBsZXMgKGV2ZW4gd2l0aGluIHRoZSBzYW1lIGNvbmRpdGlvbiksIGkuZS4gYmlvbG9naWNhbCB2YXJpYWJpbGl0eSwgbWVhbnMgdGhhdCB2YXJpYW5jZSBpcyBvZnRlbiBub3QgPT0gbWVhbiAod2hpY2ggaXMgd2hhdCBQb2lzc29uIGlzIGJhc2VkIG9uZSkuIEluIGZhY3QsIHRoZSB2YXJpYW5jZSBpcyBpbmNyZWFzZWQsIGFuZCBpcyBub3QgZXZlbiBjb25zdGFudCAoaXQgaXMgdGhlIGhpZ2hlciBpbiBoaWdobHkgZXhwcmVzc2VkIGdlbmVzKS4gSGVuY2Ugd2h5IHBvc3Npb24tYmFzZWQgbW9kZWxsaW5nIGNhbiBvbmx5IGJlIHVzZWQgd2hlbiBhbmFseXNpbmcgc2luZ2xlIHJlcGxpY2F0ZXMuIE5lZ2F0aXZlIGJpbm9taWFsIHJlcHJlc2VudHMgdGhlIGJlc3QgY2hvaWNlIGZvciBkYXRhIHdpdGggbW9yZSB0aGFuIG9uZSByZXBsaWNhdGUuIFRoaXMgaXMgd2hhdCBlZGdlUiBhbmQgRGVzZXEgdXNlLiAgDQojZ2V0IHRoZSByYXcgY291bnRzDQpjb3VudHNfcmF3ICA8LSBER0Vfb2JqZWN0JGNvdW50cyAjdGhpcyBpcyB0aGUgc2FtZSBhcyBkb2luZyBjcG0oY291bnRzKSBhbmQgbG9nMiBvZiBpdA0KDQojcHJlcGFyZSBmb3IgZ2dwbG90DQojbWFrZSBnZW5lIGNvZGVzIGFzIGNvbHVtbnMNCmNvdW50c19yYXcgPC0gYXMuZGF0YS5mcmFtZShjb3VudHNfcmF3KQ0KDQptZWFuX2NvdW50cyA8LSBhcHBseShjb3VudHNfcmF3WywgMToxMF0sIDEsIG1lYW4pDQp2YXJpYW5jZV9jb3VudHMgPC0gYXBwbHkoY291bnRzX3Jhd1ssIDE6MTBdLCAxLCB2YXIpDQpkZiA8LSBkYXRhLmZyYW1lKG1lYW5fY291bnRzLCB2YXJpYW5jZV9jb3VudHMpDQoNCnBsb3QyIDwtIGdncGxvdChkZikgKw0KICBnZW9tX3BvaW50KGFlcyh4PW1lYW5fY291bnRzLCB5PXZhcmlhbmNlX2NvdW50cyksIGFscGhhPTAuMikgKyANCiAgZ2VvbV9saW5lKGFlcyh4PW1lYW5fY291bnRzLCB5PW1lYW5fY291bnRzKSwgY29sb3I9ImRvZGdlcmJsdWUiKSArDQogIHhsYWIoIm1lYW4gcmF3IGNvdW50cyIpICsNCiAgeWxhYigidmFyaWFuY2UiKSsNCiAgZ2d0aXRsZSgiTWVhbi1WYXJpYW5jZSByZWxlYXJpb25zaGlwIChyYXcgY291bnRzLCBETVNPKSIsIHN1YnRpdGxlID0gInRoZSB2YXJpYW5jZSBvZiBlYWNoIGdlbmUgaXMgZ2VuZXJhbGx5IGhpZ2hlciB0aGFuIGl0cyBtZWFuIikrDQogIHNjYWxlX3lfbG9nMTAoKSArDQogIHNjYWxlX3hfbG9nMTAoKSsNCiAgdGhlbWVfYncoKSsNCiAgTlVMTCAgDQogICAgDQpncmlkLmFycmFuZ2UocGxvdDEsIHBsb3QyLCBwbG90MywgcGxvdDQsIG5jb2w9MiwgbnJvdz0yKQ0KDQpybShwbG90MSwgcGxvdDIsIHBsb3QzLCBwbG90NCwgY291bnRzX3JhdywgZGYsIG1lYW5fY291bnRzLCB2YXJpYW5jZV9jb3VudHMpDQpgYGANCg0KIyMjIyMgX19DUE1fXw0KDQpDb3VudCBkYXRhIGlzIG5vdCBub3JtYWxseSBkaXN0cmlidXRlZCwgc28gaWYgd2Ugd2FudCB0byBleGFtaW5lIHRoZSBkaXN0cmlidXRpb25zIG9mIHRoZSByYXcgY291bnRzIHdlIG5lZWQgdG8gbG9nIHRoZSBjb3VudHMuIE5leHQgd2XigJlsbCB1c2UgYm94IHBsb3RzIHRvIGNoZWNrIHRoZSBkaXN0cmlidXRpb24gb2YgdGhlIHJlYWQgY291bnRzIG9uIHRoZSBsb2cyIHNjYWxlLiBXZSBjYW4gdXNlIHRoZSBjcG0gZnVuY3Rpb24gdG8gZ2V0IGxvZzIgY291bnRzIHBlciBtaWxsaW9uLCB3aGljaCBhcmUgY29ycmVjdGVkIGZvciB0aGUgZGlmZmVyZW50IGxpYnJhcnkgc2l6ZXMuIFRoZSBjcG0gZnVuY3Rpb24gYWxzbyBhZGRzIGEgc21hbGwgb2Zmc2V0ICgwLjI1KSB0byBhdm9pZCB0YWtpbmcgbG9nIG9mIHplcm8uDQoNCkJlbG93LCBhIGNvbXBhcmlzb24gYmV0d2VlbiBnZW5lIGNvdW50cyBiZWZvcmUgYW5kIGFmdGVyIGxvZyB0cmFuc2Zvcm1hdGlvbiBhbmQgQ291bnRzIHBlciBNaWxsaW9uICh0byBhY2NvdW50IGZvciBkaWZmZXJlbnQgbGlicmFyeSBzaXplcykuIFRoZSBkaXN0cmlidXRpb24gb2YgdGhlIGNvdW50cyBpcyBzaG93biBhcyBhIGRlbnNpdHkgcGxvdCBib3R0b20gcmlnaHQuIDxzcGFuIHN0eWxlPSJjb2xvcjojYjNiM2IzIj5Db250cm9sPC9zcGFuPiwgPHNwYW4gc3R5bGU9ImNvbG9yOiM3Y2NkN2MiPlQzPC9zcGFuPiAsIDxzcGFuIHN0eWxlPSJjb2xvcjojZjA4MDgwIj5NUEk8L3NwYW4+ICwgPHNwYW4gc3R5bGU9ImNvbG9yOiM4N2NlZmEiPkNQRjwvc3Bhbj4gLCA8c3BhbiBzdHlsZT0iY29sb3I6I2VlN2FlOSI+Q1BGK1QzPC9zcGFuPi4gPGJyLz4NCmBgYHtyLCBmaWcud2lkdGg9MTUsIGZpZy5oZWlnaHQ9MTAsIGVjaG89RkFMU0V9DQojc2V0IHNwYWNlIGZvciB0aHJlZSBwbG90cw0KcGFyKG1mcm93PWMoMiwyKSkNCg0KIyBnZXQgdGhlIGRhdGEgYXMgKGxvZzIpIGNvdW50cyBwZXIgbWlsbGlvbg0KY291bnRzX0NQTWxvZzIgIDwtIGNwbShER0Vfb2JqZWN0LGxvZz1UUlVFKSAjdGhpcyBpcyB0aGUgc2FtZSBhcyBkb2luZyBjcG0oY291bnRzKSBhbmQgbG9nMiBvZiBpdA0KDQojIEp1c3QgZm9yIHJlZmVyZW5jZSwgcGxvdCB0aGUgZGlzdHJpYnV0aW9uIG9mIHByZXZpb3VzIHJhdyBkYXRhIGNvdW50cyAoaGVyZSBvbiBsb2cgc2NhbGUpDQpib3hwbG90KGxvZzIoYXMubWF0cml4KERHRV9vYmplY3QpKzAuMjUpLCAjdGhpcyB3aWxsIHVzZSB0aGUgImNvdW50cyIgc2xvdCA9IGRvaW5nIGl0IG9uICJjb3VudHMiDQogICAgICAgIHhsYWI9IiIsIA0KICAgICAgICB5bGFiPSJMb2cyIGNvdW50cyAocmF3IGRhdGEgKyAwLjI1KSIsDQogICAgICAgIGxhcz0yLA0KICAgICAgICBjb2wgPSBjb2xvcl9saXN0LA0KICAgICAgICBib3JkZXIgPSAiZ3JheSIpDQojIExldCdzIGFkZCBhIGJsdWUgaG9yaXpvbnRhbCBsaW5lIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIG1lZGlhbiB2YWx1ZQ0KYWJsaW5lKGg9bG9nMihtZWRpYW4oREdFX29iamVjdCRjb3VudHMpKzAuMjUpLGNvbD0iYmx1ZSIpDQp0aXRsZSgiQm94cGxvdHMgb2YgbG9nY291bnRzIChyYXcgZGF0YSwgdW5ub3JtYWxpc2VkKSIpDQoNCg0KIyBQbG90IHRoZSBkaXN0cmlidXRpb25zIG9mIHRoZShsb2cyKSBjb3VudHMgcGVyIG1pbGxpb24NCmJveHBsb3QoY291bnRzX0NQTWxvZzIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI2Z1bmN0aW9uIGNwbSgpIGFkZHMgYWxyZWFkeSBhIHNtYWxsIHZhbHVlIHRvIGF2b2lkIGxvZygwKQ0KICAgICAgICB4bGFiPSIiLCANCiAgICAgICAgeWxhYj0iTG9nMiAoY291bnRzIHBlciBtaWxsaW9uICswLjI1KSIsDQogICAgICAgIGxhcz0yLA0KICAgICAgICBjb2wgPSBjb2xvcl9saXN0LA0KICAgICAgICBib3JkZXIgPSAiZ3JheSIpDQojIExldCdzIGFkZCBhIGJsdWUgaG9yaXpvbnRhbCBsaW5lIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIG1lZGlhbiBsb2dDUE0NCmFibGluZShoPW1lZGlhbihjb3VudHNfQ1BNbG9nMiksY29sPSJibHVlIikNCnRpdGxlKCJCb3hwbG90cyBvZiBsb2dDUE1zICh1bm5vcm1hbGlzZWQpIikNCg0KI0Zyb20gdGhlIGJveHBsb3RzIHdlIHNlZSB0aGF0IG92ZXJhbGwgdGhlIGRlbnNpdHkgZGlzdHJpYnV0aW9ucyBvZiByYXcgbG9nLWludGVuc2l0aWVzIGFyZSBub3QgdmVyeSBkaWZmZXJlbnQuIElmIGEgc2FtcGxlIGlzIHJlYWxseSBmYXIgYWJvdmUgb3IgYmVsb3cgdGhlIGJsdWUgaG9yaXpvbnRhbCBsaW5lIHdlIG1heSBuZWVkIHRvIGludmVzdGlnYXRlIHRoYXQgc2FtcGxlIGZ1cnRoZXIuIEFub3RoZXIga2luZCBvZiBRQyBwbG90IHRoYXQgaXMgaGVscGZ1bCBpbiBjaGVja2luZyBmb3IgZG9kZ3kgc2FtcGxlcyBpcyBhIHJlbGF0aXZlIGxvZyBleHByZXNzaW9uIChSTEUpIHBsb3QsIHdoaWNoIGNhbiBiZSBnZW5lcmF0ZWQgd2l0aCBwbG90UkxFIGZyb20gdGhlIEVEQVNlcSBwYWNrYWdlLg0KDQoNCg0KIyBUaGUgREdFb2JqZWN0IGFscmVhZHkgY2FsY3VsYXRlZCBsaWJyYXJ5IHNpemVzIGF1dG9tYXRpY2FsbHksIGFuZCBzdG9yZXMgdGhhdCB2YWx1ZSBpbiB0aGUgInNhbXBsZXMiIHNsb3QNCiMgU2luY2UgQ1BNIGFkanVzdHMgZm9yIGxpYnJhcnkgc2l6ZSBkaWZmZXJlbWNlcywgc2hvdyB0aGVzZSBsaWJyYXJ5IHNpemVzDQojIHBsb3QgdGhlIGxpYnJhcnkgc2l6ZXMgb2YgYWxsIHRoZSBzYW1wbGVzDQojY2hlY2sgZm9yIGJpZyBkaXNjcmVwYW5jaWVzIGJldHdlZW4gc2FtcGxlcw0KYmFycGxvdChER0Vfb2JqZWN0JHNhbXBsZXMkbGliLnNpemUgLzFlMDYsICAgICAgICAgICAjIGRpdmlkZSBieSBtaWxsaW9ucyB0byBqdXN0IHBsb3QgaW4gbWlsbGlvbnMNCiAgICAgICAgbmFtZXM9Y29sbmFtZXMoREdFX29iamVjdCksICAgICAgICAgICAgICAgICAgIyB1c2Ugc2FtcGxlIG5hbWVzIGFzIGxhYmVscw0KICAgICAgICBsYXM9MiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFRoZSAibGFzIiBhcmd1bWVudCByb3RhdGVzIHRoZSBheGlzIG5hbWVzDQogICAgICAgIGFubj1GQUxTRSwNCiAgICAgICAgY2V4Lm5hbWVzPTAuNzUsDQogICAgICAgIGNvbCA9IGNvbG9yX2xpc3QsDQogICAgICAgIGJvcmRlciA9IE5BLA0KICAgICAgICB5bGltID0gYygwLDE1KSkNCm10ZXh0KHNpZGUgPSAxLCB0ZXh0ID0gIiIsIGxpbmUgPSA0KQ0KbXRleHQoc2lkZSA9IDIsIHRleHQgPSAiTGlicmFyeSBzaXplIChtaWxsaW9ucykiLCBsaW5lID0gMykNCnRpdGxlKCJMaWJyYXJ5IHNpemVzIChyYXcgZGF0YSkiKQ0KDQoNCiMjIENoZWNrIGRpc3RyaWJ1dGlvbnMgb2YgbWVhc3VyZWQgZXhwcmVzc2lvbiB2YWx1ZXMgdXNpbmcgbGluZXBsb3RzDQoNCiMgQ2hlY2sgZGlzdHJpYnV0aW9ucyBvZiBtZWFzdXJlZCBleHByZXNzaW9uIHZhbHVlcyB1c2luZyBsaW5lcGxvdHMNCnBsb3QoZGVuc2l0eShjb3VudHNfQ1BNbG9nMlssIDFdKSwgDQogICAgIG1haW49IiIsDQogICAgIHhsYWI9ImxvZzIoQ1BNICsgMC4yNSkiLA0KICAgICB5bGFiPSJEZW5zaXR5IiwNCiAgICAgY29sID0gY29sb3JfbGlzdFsxXSwNCiAgICAgeWxpbT1yYW5nZShwcmV0dHkoYygwLCAwLjIpKSkpDQoNCmZvciAoaSBpbiAyOmRpbShjb3VudHNfQ1BNbG9nMilbMl0pIHsNCiAgbGluZXMoZGVuc2l0eShjb3VudHNfQ1BNbG9nMlssIGldKSwgDQogICAgICAgIGNvbD0gY29sb3JfbGlzdFtpXQ0KICAgICAgICApDQogIHRpdGxlKG1haW4gPSBOVUxMKQ0KfQ0KDQp0aXRsZSgiRGVuc2l0eSBkaXN0cmlidXRpb24gb2YgbG9nMiBDUE0gY291bnRzIikNCg0KIyMgcmVtb3ZlIHVudXNlZCB2YXJpYWJsZXMNCnJtKGkpDQpgYGANCg0KYGBge3IsIGZpZy53aWR0aD0yNSwgZmlnLmhlaWdodD00LCB3YXJuaW5nPUZBTFNFLCBlY2hvPUZBTFNFfQ0KIyMgUGxvdCBSTEUgKHJlbGF0aXZlIGV4cHJlc3Npb24gbGV2ZWwpIHRvIGNoZWNrIGVmZmVjdGl2ZW5lc3Mgb2Ygbm9ybWFsaXNhdGlvbg0KIyBhIFJMRSBwbG90IGlzLCBvbiBsb2cgY291bnRzLCB0aGUgZGV2aWF0aW9uIG9mIGVhY2ggZ2VuZSByZWNvcmRpbmcsIHRvIGl0cyBhdmVyYWdlIGFjcm9zcyBhbGwgc2FtcGxlcw0KDQpSTEVfY291bnRzX2ZvcmdncGxvdCA8LSBzd2VlcChsb2cyKGFzLmRhdGEuZnJhbWUoREdFX29iamVjdCRjb3VudHMpKzAuMjUpLCBNQVJHSU49MSwgU1RBVFM9IHJvd01lYW5zKGxvZzIoYXMuZGF0YS5mcmFtZShER0Vfb2JqZWN0JGNvdW50cykrMC4yNSkpKQ0KUkxFX2NvdW50c19mb3JnZ3Bsb3QkZ2VuZXMgPC0gcm93Lm5hbWVzKFJMRV9jb3VudHNfZm9yZ2dwbG90KQ0KUkxFX2NvdW50c19mb3JnZ3Bsb3QgIDwtIFJMRV9jb3VudHNfZm9yZ2dwbG90ICAlPiUgIHBpdm90X2xvbmdlcigtZ2VuZXMsIG5hbWVzX3RvID0gIkNvbmRpdGlvbiIsIHZhbHVlc190byA9ICJkZXZpYXRpb25zIikNCiNsb2NrIGluIHRoZSBvcmRlciBvZiB0aGUgc2FtcGxlcywgb3IgdGhleSB3aWxsIGJlIHJlYXJyYW5nZWQgZHVyaW5nIHBsb3R0aW5nDQpSTEVfY291bnRzX2ZvcmdncGxvdCRDb25kaXRpb24gPC0gZmFjdG9yKFJMRV9jb3VudHNfZm9yZ2dwbG90JENvbmRpdGlvbiwgbGV2ZWxzID0gIG9yZGVyZWRfbGV2ZWxzKQ0KDQpwbG90MSA8LSBnZ3Bsb3QoUkxFX2NvdW50c19mb3JnZ3Bsb3QsIGFlcyh4PUNvbmRpdGlvbiwgeT1kZXZpYXRpb25zLCBmaWxsPUNvbmRpdGlvbikpICsNCiAgZ2VvbV92aW9saW4odHJpbT1GQUxTRSkrDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1jb2xvcl9saXN0KSsNCiAgI2dlb21faml0dGVyKHNoYXBlPTE2LCBwb3NpdGlvbj1wb3NpdGlvbl9qaXR0ZXIoMC4yKSwgYWxwaGE9MC4wMSkgKw0KICAjZ2VvbV9ib3hwbG90KHdpZHRoPTAuMSwgb3V0bGllci5jb2xvciA9ICJibGFjayIsIG91dGxpZXIuYWxwaGE9MC4wMSkrDQogIHN0YXRfc3VtbWFyeShmdW49bWVkaWFuLCBwY2g9MjEsIHNpemU9MC41LCBjb2xvcj0iYmxhY2siLCBmaWxsPSJkb2RnZXJibHVlIikrDQogIHRoZW1lX2NsYXNzaWMoKSsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJub25lIiwgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwgdmp1c3QgPSAwLjUsIGhqdXN0PTEpKSsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0PTAsIGxpbmV0eXBlPSJsb25nZGFzaCIsIGNvbG9yID0gImRvZGdlcmJsdWUiLCBzaXplPTAuNSkrDQogIHhsYWIoIiIpICsgDQogIHlsYWIoIlJlbGF0aXZlIGxvZzIgZXhwcmVzc2lvbiBvZiBlYWNoIGdlbmUgKGV4cHJlc3Npb24tbWVhbikiKSsNCiAgZ2d0aXRsZSgiUmVsYXRpdmUgTGV2ZWxzIG9mIEV4cHJlc3Npb246IHJhd2NvdW50cyIpKw0KICBOVUxMDQoNCnRtcCA8LWFzLmRhdGEuZnJhbWUoMl4oY291bnRzX0NQTWxvZzItMC4yNSkpDQpSTEVfbG9nQ1BNX2ZvcmdncGxvdCA8LSBzd2VlcChsb2cyKHRtcCksIE1BUkdJTj0xLCBTVEFUUz0gcm93TWVhbnMobG9nMih0bXApKSkgDQpSTEVfbG9nQ1BNX2ZvcmdncGxvdCRnZW5lcyA8LSByb3cubmFtZXMoYXMuZGF0YS5mcmFtZShSTEVfbG9nQ1BNX2ZvcmdncGxvdCkpDQpSTEVfbG9nQ1BNX2ZvcmdncGxvdCA8LSBSTEVfbG9nQ1BNX2ZvcmdncGxvdCAgJT4lICBwaXZvdF9sb25nZXIoLWdlbmVzLCBuYW1lc190byA9ICJDb25kaXRpb24iLCB2YWx1ZXNfdG8gPSAiZGV2aWF0aW9ucyIpDQojbG9jayBpbiB0aGUgb3JkZXIgb2YgdGhlIHNhbXBsZXMsIG9yIHRoZXkgd2lsbCBiZSByZWFycmFuZ2VkIGR1cmluZyBwbG90dGluZw0KUkxFX2xvZ0NQTV9mb3JnZ3Bsb3QkQ29uZGl0aW9uIDwtIGZhY3RvcihSTEVfbG9nQ1BNX2ZvcmdncGxvdCRDb25kaXRpb24sIGxldmVscyA9ICBvcmRlcmVkX2xldmVscykNCg0KcGxvdDIgPC0gZ2dwbG90KFJMRV9sb2dDUE1fZm9yZ2dwbG90LCBhZXMoeD1Db25kaXRpb24sIHk9ZGV2aWF0aW9ucywgZmlsbD1Db25kaXRpb24pKSArDQogIGdlb21fdmlvbGluKHRyaW09RkFMU0UpKw0KICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9Y29sb3JfbGlzdCkrDQogICNnZW9tX2ppdHRlcihzaGFwZT0xNiwgcG9zaXRpb249cG9zaXRpb25faml0dGVyKDAuMiksIGFscGhhPTAuMDEpICsNCiAgI2dlb21fYm94cGxvdCh3aWR0aD0wLjEsIG91dGxpZXIuY29sb3IgPSAiYmxhY2siLCBvdXRsaWVyLmFscGhhPTAuMDEpKw0KICBzdGF0X3N1bW1hcnkoZnVuPW1lZGlhbiwgcGNoPTIxLCBzaXplPTAuNSwgY29sb3I9ImJsYWNrIiwgZmlsbD0iZG9kZ2VyYmx1ZSIpKw0KICB0aGVtZV9jbGFzc2ljKCkrDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIHZqdXN0ID0gMC41LCBoanVzdD0xKSkrDQogIGdlb21faGxpbmUoeWludGVyY2VwdD0wLCBsaW5ldHlwZT0ibG9uZ2Rhc2giLCBjb2xvciA9ICJkb2RnZXJibHVlIiwgc2l6ZT0wLjUpKw0KICB5bGltKGMoLTEwLDEwKSkrDQogIHhsYWIoIiIpICsgDQogIHlsYWIoIlJlbGF0aXZlIGxvZzIgZXhwcmVzc2lvbiBvZiBlYWNoIGdlbmUgKGV4cHJlc3Npb24tbWVhbikiKSsNCiAgZ2d0aXRsZSgiUmVsYXRpdmUgTGV2ZWxzIG9mIEV4cHJlc3Npb246IGxvZ0NQTXMiKSsNCiAgTlVMTA0KDQpncmlkLmFycmFuZ2UocGxvdDEsIHBsb3QyLCBuY29sPTIsIG5yb3c9MSkNCg0KI3JlbW92ZSB1bnVzZWQgdmFyaWFibGVzDQpybSh0bXAsIFJMRV9jb3VudHNfZm9yZ2dwbG90LCBSTEVfbG9nQ1BNX2ZvcmdncGxvdCwgcGxvdDEsIHBsb3QyKQ0KYGBgDQoNCjxici8+DQoNCiMjIyMjIF9fRGV0ZXJtaW5lIGZpbHRlcmluZyB0aHJlc2hvbGRfXw0KDQogWW91IHNob3VsZCBmaWx0ZXIgd2l0aCBDUE1zIHJhdGhlciB0aGFuIGZpbHRlcmluZyBvbiB0aGUgY291bnRzIGRpcmVjdGx5LCBhcyB0aGUgbGF0dGVyIGRvZXMgbm90IGFjY291bnQgZm9yIGRpZmZlcmVuY2VzIGluIGxpYnJhcnkgc2l6ZXMgYmV0d2VlbiBzYW1wbGVzLg0KDQpgYGB7ciwgZWNobz1GQUxTRX0NCiMgV2UgZmlsdGVyIG9uIHRoZSBjb3VudHMgcGVyIG1pbGxpb24sIGJ1dCBub3QgbG9nZ2VkIHNvIHRoZSBjYWxjdWxhdGlvbnMgYXJlIG1vcmUgaW50dWl0aXZlDQojIHdlIGNhbiBlaXRoZXIgdXNlIDJeY291bnRzX0NQTWxvZzIgKGkuZS4gdW5kb2luZyB0aGUgbG9nMiB0aGF0IGhhZCBiZWVuIGFwcGxpZWQpDQojIG9yIGNyZWF0ZSBhIG5ldyBvYmplY3QNCmNvdW50c19DUE1yYXcgIDwtIGNwbShER0Vfb2JqZWN0LGxvZz1GQUxTRSkgI25vdGljZSBob3cgbm93IHdlIGFyZSBub3QgdGFraW5nIHRoZSBsb2cNCmBgYA0KDQpTZXQgYSBDUE0gdGhyZXNob2xkIHRoYXQgY29ycmVzcG9uZHMgdG8gYSBjb3VudCBvZiAxMC0xNSBmb3IgdGhlIGxpYnJhcnkgc2l6ZXMgaW4geW91ciBkYXRhIHNldCAoZS5nLiAwLjUgZm9yIGEgbGlicmFyeSBvZiBhcm91bmQgMjBtaWxsaW9uKS4gMC41IENPVU5UUyBQRVIgTUlMTElPTiAqIDIwbWlsbGlvbnMgPSAxMCBDT1VOVFMuIElmIHRoZSBjb3VudCBpcyBhbnkgc21hbGxlciwgaXQgaXMgY29uc2lkZXJlZCB0byBiZSB2ZXJ5IGxvdywgaW5kaWNhdGluZyB0aGF0IHRoZSBhc3NvY2lhdGVkIGdlbmUgaXMgbm90IGV4cHJlc3NlZCBpbiB0aGF0IHNhbXBsZS4gDQoNCkEgcmVxdWlyZW1lbnQgZm9yIGV4cHJlc3Npb24gaW4gMTAgb3IgbW9yZSBsaWJyYXJpZXMgaXMgdXNlZCBhcyBlYWNoIGdyb3VwIGNvbnRhaW5zIDEwIHJlcGxpY2F0ZXMuIFRoaXMgZW5zdXJlcyB0aGF0IGEgZ2VuZSB3aWxsIGJlIHJldGFpbmVkIGlmIGl0IGlzIG9ubHkgZXhwcmVzc2VkIGluIG9uZSBncm91cC4gU21hbGxlciBDUE0gdGhyZXNob2xkcyBhcmUgdXN1YWxseSBhcHByb3ByaWF0ZSBmb3IgbGFyZ2VyIGxpYnJhcmllcy4gQXMgYSBnZW5lcmFsIHJ1bGUsICoqYSBnb29kIHRocmVzaG9sZCBjYW4gYmUgY2hvc2VuIGJ5IGlkZW50aWZ5aW5nIHRoZSBDUE0gdGhhdCBjb3JyZXNwb25kcyB0byBhIGNvdW50IG9mIDEwKiouDQoNCldoYXQgY291bnRzIGFzICJsb3dseSBleHByZXNzZWQiIGRlcGVuZHMgb24gbGlicmFyeSBzaXplLiBXZSB3aWxsIG5vdyBmaW5kIGxpYnJhcnkgc2l6ZXMgb2YgZWFjaCBzYW1wbGUuDQpGaXJzdCwgd2UgY2FuIGNoZWNrIGhvdyBtYW55IHJlYWRzIHdlIGhhdmUgZm9yIGVhY2ggc2FtcGxlIGluIHRoZSBER0Ugb2JqZWN0ICh0aGlzIGlzIGF1dG9tYXRpYyBjYWxjdWxhdGVkIGJ5IHRoZSBER0Ugb2JqZWN0KS4NCg0KYGBge3IsIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD01LCBlY2hvPUZBTFNFfQ0KIyBUaGUgREdFb2JqZWN0IGFscmVhZHkgY2FsY3VsYXRlZCBsaWJyYXJ5IHNpemVzIGF1dG9tYXRpY2FsbHksIGFuZCBzdG9yZXMgdGhhdCB2YWx1ZSBpbiB0aGUgInNhbXBsZXMiIHNsb3QNCiMgc2hvdyB0aGUgbGlicmFyeSBzaXplcyBvZiBlYWNoIHNhbXBsZQ0KREdFX29iamVjdCRzYW1wbGVzWyxjKCJncm91cCIsImxpYi5zaXplIildIA0KDQojIHBsb3QgdGhlIGxpYnJhcnkgc2l6ZXMgb2YgYWxsIHRoZSBzYW1wbGVzDQojY2hlY2sgZm9yIGJpZyBkaXNjcmVwYW5jaWVzIGJldHdlZW4gc2FtcGxlcw0KYmFycGxvdChER0Vfb2JqZWN0JHNhbXBsZXMkbGliLnNpemUgLzFlMDYsICAgICAgICAgICAjIGRpdmlkZSBieSBtaWxsaW9ucyB0byBqdXN0IHBsb3QgaW4gbWlsbGlvbnMNCiAgICAgICAgbmFtZXM9Y29sbmFtZXMoREdFX29iamVjdCksICAgICAgICAgICAgICAgICAgIyB1c2Ugc2FtcGxlIG5hbWVzIGFzIGxhYmVscw0KICAgICAgICBsYXM9MiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFRoZSAibGFzIiBhcmd1bWVudCByb3RhdGVzIHRoZSBheGlzIG5hbWVzDQogICAgICAgIGFubj1GQUxTRSwgDQogICAgICAgIGNleC5uYW1lcz0wLjc1LA0KICAgICAgICBjb2wgPSBjb2xvcl9saXN0LA0KICAgICAgICBib3JkZXIgPSBOQSwNCiAgICAgICAgeWxpbSA9IGMoMCwgMTUpKQ0KbXRleHQoc2lkZSA9IDEsIHRleHQgPSAiU2FtcGxlcyIsIGxpbmUgPSA0KQ0KbXRleHQoc2lkZSA9IDIsIHRleHQgPSAiTGlicmFyeSBzaXplIChtaWxsaW9ucykiLCBsaW5lID0gMykNCnRpdGxlKCJMaWJyYXJ5IHNpemVzIChyYXcgZGF0YSkiKQ0KDQoNCiMgU2hvdyBtYXgsIG1pbiwgYW5kIG1lYW4gbGlicmFyeSBzaXplDQpjYXQoIlRoZSBtYXggbGlicmFyeSBzaXplIGlzIiwgbWF4KERHRV9vYmplY3Qkc2FtcGxlcyRsaWIuc2l6ZSkgLCAiOiBzYW1wbGUiLCBtYXRjaChtYXgoREdFX29iamVjdCRzYW1wbGVzJGxpYi5zaXplKSwgREdFX29iamVjdCRzYW1wbGVzJGxpYi5zaXplKSwgIjoiLCByb3duYW1lcyhER0Vfb2JqZWN0JHNhbXBsZXMpW0RHRV9vYmplY3Qkc2FtcGxlcyRsaWIuc2l6ZSA9PSBtYXgoREdFX29iamVjdCRzYW1wbGVzJGxpYi5zaXplKV0sICJcbiIpDQoNCmNhdCgiVGhlIG1lYW4gbGlicmFyeSBzaXplIGlzIiwgbWVhbihER0Vfb2JqZWN0JHNhbXBsZXMkbGliLnNpemUpLCAiXG4iKQ0KDQpjYXQoIlRoZSBtaW4gbGlicmFyeSBzaXplIGlzIiwgbWluKERHRV9vYmplY3Qkc2FtcGxlcyRsaWIuc2l6ZSkgLCAiOiBzYW1wbGUiLCBtYXRjaChtaW4oREdFX29iamVjdCRzYW1wbGVzJGxpYi5zaXplKSwgREdFX29iamVjdCRzYW1wbGVzJGxpYi5zaXplKSwgIjoiLCByb3duYW1lcyhER0Vfb2JqZWN0JHNhbXBsZXMpW0RHRV9vYmplY3Qkc2FtcGxlcyRsaWIuc2l6ZSA9PSBtaW4oREdFX29iamVjdCRzYW1wbGVzJGxpYi5zaXplKV0sICJcbiIpDQpgYGANCmBgYHtyLCBlY2hvPUZBTFNFfQ0KIyMgY2FsY3VsYXRlIENQTSBmaWx0ZXJpbmcgdGhyZXNob2xkIHdoaWNoIHdpbGwgY29ycmVzcG9uZCB0byBhdCBsZWFzdCAxMCBDUE0gaW4gdGhlIHNtYWxsZXN0IGxpYnJhcnkgKGhlbmNlIGluIGFsbCBvZiB0aGVtKQ0KZmlsdGVyaW5nX3RocmVzaG9sZCA8LSAxMCoxMF42L21pbihER0Vfb2JqZWN0JHNhbXBsZXMkbGliLnNpemUpDQoNCg0KY2F0KCJUaGUgZmlsdGVyaW5nIHRocmVzaG9sZCBvZiIsIGZpbHRlcmluZ190aHJlc2hvbGQgLCAiaGFzIGJlZW4gY2hvc2VuIFxuIikNCmBgYA0KYGBge3IsIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD01LCBlY2hvPUZBTFNFfQ0KI3NldCBzcGFjZSBmb3IgdHdvIHBsb3RzDQpwYXIobWZyb3c9YygxLDIpKQ0KDQojIExldCdzIGhhdmUgYSBsb29rIGFuZCBzZWUgd2hldGhlciBvdXIgZmlsdGVyaW5nIHRocmVzaG9sZCBkb2VzIGluZGVlZCBjb3JyZXNwb25kIHRvIGEgY291bnQgb2YgYWJvdXQgMTANCiMgV2Ugd2lsbCBsb29rIGF0IHRoZSBzYW1wbGUgd2l0aCB0aGUgbG93ZXN0IGxpYnJhcnkgc2l6ZSAoc2FtcGxlIEMwMyBpbiBvdXIgY2FzZSkNCg0KcGxvdChjb3VudHNfQ1BNcmF3WyxtYXRjaChtaW4oREdFX29iamVjdCRzYW1wbGVzJGxpYi5zaXplKSwgREdFX29iamVjdCRzYW1wbGVzJGxpYi5zaXplKV0sDQogICAgIGNvdW50c1ssbWF0Y2gobWluKERHRV9vYmplY3Qkc2FtcGxlcyRsaWIuc2l6ZSksIERHRV9vYmplY3Qkc2FtcGxlcyRsaWIuc2l6ZSldLCAgICAgICAgICAjY291bGQganVzdCB3cml0ZSBbLDIxXQ0KICAgICNjb3VudHNfQ1BNcmF3WywyM10sDQogICAgICNjb3VudHNbLDI4XSwgDQogICAgIHlsaW09YygwLDIwKSwNCiAgICAgeGxpbT1jKDAsMS41KSwNCiAgICAgY29sID0gYWxwaGEoImJsYWNrIiwgMC4wNSksDQogICAgIHBjaD0xNiwNCiAgICAgYW5uPUZBTFNFKQ0KbXRleHQoc2lkZSA9IDEsIHRleHQgPSAiQ291bnRzIHBlciBtaWxsaW9uIChyYXcpIGluIHNhbXBsZSB3aXRoIHNtYWxsZXN0IGxpYnJhcnkgc2l6ZSIsIGxpbmUgPSA0KQ0KbXRleHQoc2lkZSA9IDIsIHRleHQgPSAiUmF3IGNvdW50cyBpbiBzYW1wbGUgd2l0aCBzbWFsbGVzdCBsaWJyYXJ5IHNpemUiLCBsaW5lID0gMykNCiMgQWRkIGEgdmVydGljYWwgbGluZSBhdCAwLjUxMiBDUE0NCmFibGluZSh2PWZpbHRlcmluZ190aHJlc2hvbGQsIGNvbD0iZG9kZ2VyYmx1ZSIpDQojIEFkZCBhIHJlZmVyZW5jZSBsaW5lIGF0IGNvdW50cyA9IDEwDQphYmxpbmUoaD0xMCwgY29sPSJkb2RnZXJibHVlIikNCg0KDQojbGV0J3MgYWxzbyByZXBsb3QgdGhlIGxpYnJhcnkgc2l6ZXMNCiMgcGxvdCB0aGUgbGlicmFyeSBzaXplcyBvZiBhbGwgdGhlIHNhbXBsZXMNCmJhcnBsb3QoREdFX29iamVjdCRzYW1wbGVzJGxpYi5zaXplIC8xZTA2LCAgICAgICAgICAgIyBkaXZpZGUgYnkgbWlsbGlvbnMgdG8ganVzdCBwbG90IGluIG1pbGxpb25zDQogICAgICAgIG5hbWVzPWNvbG5hbWVzKERHRV9vYmplY3QpLCAgICAgICAgICAgICAgICAgICMgdXNlIHNhbXBsZSBuYW1lcyBhcyBsYWJlbHMNCiAgICAgICAgbGFzPTIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBUaGUgImxhcyIgYXJndW1lbnQgcm90YXRlcyB0aGUgYXhpcyBuYW1lcw0KICAgICAgICBhbm49RkFMU0UsIA0KICAgICAgICBjZXgubmFtZXM9MC43NSwNCiAgICAgICAgY29sID0gY29sb3JfbGlzdCwNCiAgICAgICAgYm9yZGVyID0gTkEsDQogICAgICAgIHlsaW0gPSBjKDAsMTUpKQ0KbXRleHQoc2lkZSA9IDEsIHRleHQgPSAiIiwgbGluZSA9IDQpDQptdGV4dChzaWRlID0gMiwgdGV4dCA9ICJMaWJyYXJ5IHNpemUgKG1pbGxpb25zKSIsIGxpbmUgPSAzKQ0KdGl0bGUoIkxpYnJhcnkgc2l6ZXMgKHJhdyBkYXRhKSIpDQpgYGANCg0KPGJyLz4NCg0KIyMjIyMgX19GaWx0ZXIgdGhlIGNvdW50c19fDQoNCmBgYHtyfQ0KIyMgTm93IHRoYXQgd2UgYXJlIHNhdGlzZmllZCB3aXRoIENQTSB0aHJlc2hvbGQsIHdlIGNhbiBmaWx0ZXIgdGhlIGRhdGENCiMgRmluZCBDUE0gdmFsdWVzIHRoYXQgYXJlIGdyZWF0ZXIgdGhhbiB0aGUgdGhyZXNob2xkIGVzdGFibGlzaGVkIGFib3ZlDQphYm92ZV90aHJlc2hvbGQgPC0gY291bnRzX0NQTXJhdyA+IGZpbHRlcmluZ190aHJlc2hvbGQNCiMgVGhpcyBwcm9kdWNlcyBhIGxvZ2ljYWwgbWF0cml4IHdpdGggVFJVRXMgYW5kIEZBTFNFcw0KDQojIHdlIHdvdWxkIGxpa2UgdG8ga2VlcCBnZW5lcyB0aGF0IGhhdmUgYXQgbGVhc3QgMiBUUlVFUyBpbiBlYWNoIHJvdyBvZiAiYWJvdmVfdGhyZXNob2xkIg0Ka2VlcCA8LSByb3dTdW1zKGFib3ZlX3RocmVzaG9sZCkgPj0gMTAgIyAxMCBiZWNhdXNlIHdlIGhhdmUgMTAgYmlvbG9naWNhbCByZXBsaWNhdGVzIHBlciBjb25kaXRpb24gKGVhY2ggd2l0aCAyIGxhbmVzKQ0Kc3VtbWFyeShrZWVwKQ0KYGBgDQpgYGB7ciwgZWNobz1GQUxTRX0NCiNXZSBjYW4gbm93IGVmZmVjdGl2ZWx5IGZpbHRlciBvdXIgb3JpZ2luYWwgREdFIG9iamVjdA0KREdFX29iamVjdF9maWx0ZXJlZCA8LSBER0Vfb2JqZWN0W2tlZXAsIGtlZXAubGliLnNpemVzPUZBTFNFXQ0KDQojTm90ZTogQWx0ZXJuYXRpdmVseSwgdGhlIGVkZ2VSIGZ1bmN0aW9uIGZpbHRlckJ5RXhwciBjYW4gYmUgdXNlZCB0byBwZXJmb3JtIHRoaXMgbWV0aG9kIG9mIGZpbHRlcmluZyBhdXRvbWF0aWNhbGx5LCBhcyBkZW1vbnN0cmF0ZWQgaW4gdGhlIGxpbW1hLCBHbGltbWEgYW5kIGVkZ2VSIHdvcmtmbG93IGFydGljbGUgKENoYXJpdHkgVy4gTGF3IGV0IGFsLiAyMDE4KS4NCmBgYA0KDQo8YnIvPg0KDQojIyMjIyBfX1JlcGxvdCBhZnRlciBmaWx0ZXJpbmdfXw0KDQpgYGB7ciwgZmlnLndpZHRoPTIwLCBmaWcuaGVpZ2h0PTEwLCBlY2hvPUZBTFNFfQ0KI3NldCBzcGFjZSBmb3Igc2l4IHBsb3RzDQpwYXIobWZyb3c9YygyLDMpKQ0KDQojIEdldCBsb2cyIGNvdW50cyBwZXIgbWlsbGlvbg0KY291bnRzX0NQTWxvZzJfZmlsdGVyZWQgPC0gY3BtKERHRV9vYmplY3RfZmlsdGVyZWQsbG9nPVRSVUUpDQoNCiMgSnVzdCBmb3IgcmVmZXJlbmNlLCBwbG90IHRoZSBkaXN0cmlidXRpb24gb2YgcHJldmlvdXMgcmF3IGRhdGEgY291bnRzIChoZXJlIG9uIGxvZyBzY2FsZSkNCmJveHBsb3QobG9nMihhcy5tYXRyaXgoREdFX29iamVjdCkrMC4yNSksICN0aGlzIHdpbGwgdXNlIHRoZSAiY291bnRzIiBzbG90ID0gZG9pbmcgaXQgb24gImNvdW50cyINCiAgICAgICAgeGxhYj0iIiwgDQogICAgICAgIHlsYWI9IkxvZzIgY291bnRzIChyYXcgZGF0YSArIDAuMjUpIiwNCiAgICAgICAgbGFzPTIsDQogICAgICAgIGNvbCA9IGNvbG9yX2xpc3QsDQogICAgICAgIGJvcmRlciA9ICJncmF5IikNCiMgTGV0J3MgYWRkIGEgYmx1ZSBob3Jpem9udGFsIGxpbmUgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgbWVkaWFuIHZhbHVlDQphYmxpbmUoaD1sb2cyKG1lZGlhbihER0Vfb2JqZWN0JGNvdW50cykgKyAwLjI1KSxjb2w9ImJsdWUiKQ0KdGl0bGUoIkJveHBsb3RzIG9mIGxvZ2NvdW50cyAocmF3IGRhdGEsIHVubm9ybWFsaXNlZCkiKQ0KDQoNCiMgUGxvdCB0aGUgZGlzdHJpYnV0aW9ucyBvZiB0aGUgdW5maWx0ZXJlZCAobG9nMikgY291bnRzIHBlciBtaWxsaW9uDQpib3hwbG90KGNvdW50c19DUE1sb2cyLCAgICAgICAgICAgICAgICAgICAgICAgICNmdW5jdGlvbiBjcG0oKSBhZGRzIGFscmVhZHkgYSBzbWFsbCB2YWx1ZSB0byBhdm9pZCBsb2coMCkNCiAgICAgICAgeGxhYj0iIiwgDQogICAgICAgIHlsYWI9IkxvZzIgKGNvdW50cyBwZXIgbWlsbGlvbiArMC4yNSkiLA0KICAgICAgICBsYXM9MiwNCiAgICAgICAgY29sID0gY29sb3JfbGlzdCwNCiAgICAgICAgYm9yZGVyID0gImdyYXkiKQ0KIyBMZXQncyBhZGQgYSBibHVlIGhvcml6b250YWwgbGluZSB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBtZWRpYW4gbG9nQ1BNDQphYmxpbmUoaD1tZWRpYW4oY291bnRzX0NQTWxvZzIpLGNvbD0iYmx1ZSIpDQojIExldCdzIGFkZCBhIGJsdWUgaG9yaXpvbnRhbCBsaW5lIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGZpbHRlcmluZyB0aHJlc2hvbGQNCmFibGluZShoPWZpbHRlcmluZ190aHJlc2hvbGQsY29sPSJmaXJlYnJpY2sxIikNCnRpdGxlKCJCb3hwbG90cyBvZiBsb2dDUE1zICh1bm5vcm1hbGlzZWQpIikNCg0KDQojIFBsb3QgdGhlIGRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZJTFRFUkVEIChsb2cyKSBjb3VudHMgcGVyIG1pbGxpb24NCmJveHBsb3QoY291bnRzX0NQTWxvZzJfZmlsdGVyZWQsICAgICAgICAgICAgICAgICAjZnVuY3Rpb24gY3BtKCkgYWRkcyBhbHJlYWR5IGEgc21hbGwgdmFsdWUgdG8gYXZvaWQgbG9nKDApDQogICAgICAgIHhsYWI9IiIsIA0KICAgICAgICB5bGFiPSJMb2cyIChjb3VudHMgcGVyIG1pbGxpb24gKyAwLjI1KSIsDQogICAgICAgIGxhcz0yLA0KICAgICAgICBjb2wgPWNvbG9yX2xpc3QsDQogICAgICAgIGJvcmRlciA9ICJncmF5IikNCiMgTGV0J3MgYWRkIGEgYmx1ZSBob3Jpem9udGFsIGxpbmUgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgbWVkaWFuIGxvZ0NQTQ0KYWJsaW5lKGg9bWVkaWFuKGNvdW50c19DUE1sb2cyX2ZpbHRlcmVkKSxjb2w9ImJsdWUiKQ0KdGl0bGUoIkJveHBsb3RzIG9mIEZJTFRFUkVEIGxvZ0NQTXMgKHVubm9ybWFsaXNlZCkiKQ0KDQojRnJvbSB0aGUgYm94cGxvdHMgd2Ugc2VlIHRoYXQgb3ZlcmFsbCB0aGUgZGVuc2l0eSBkaXN0cmlidXRpb25zIG9mIHJhdyBsb2ctaW50ZW5zaXRpZXMgYXJlIG5vdCB2ZXJ5IGRpZmZlcmVudC4gSWYgYSBzYW1wbGUgaXMgcmVhbGx5IGZhciBhYm92ZSBvciBiZWxvdyB0aGUgYmx1ZSBob3Jpem9udGFsIGxpbmUgd2UgbWF5IG5lZWQgdG8gaW52ZXN0aWdhdGUgdGhhdCBzYW1wbGUgZnVydGhlci4gQW5vdGhlciBraW5kIG9mIFFDIHBsb3QgdGhhdCBpcyBoZWxwZnVsIGluIGNoZWNraW5nIGZvciBkb2RneSBzYW1wbGVzIGlzIGEgcmVsYXRpdmUgbG9nIGV4cHJlc3Npb24gKFJMRSkgcGxvdCwgd2hpY2ggY2FuIGJlIGdlbmVyYXRlZCB3aXRoIHBsb3RSTEUgZnJvbSB0aGUgRURBU2VxIHBhY2thZ2UuDQoNCg0KIyMgQ2hlY2sgZGlzdHJpYnV0aW9ucyBvZiBtZWFzdXJlZCBleHByZXNzaW9uIHZhbHVlcyB1c2luZyBsaW5lcGxvdHMNCg0KIyBHZXQgc29tZSBuaWNlIGNvbG91cnMgZm9yIHBsb3R0aW5nDQojIGRlZmluZSBhIGNvbG91ciBwYWxldHRlDQojbXlwYWxldHRlIDwtIGJyZXdlci5wYWwoOSwiQmx1ZXMiKSAjZnVuY3Rpb24uIOKAnFJkWWxCdeKAnSBpcyBhIGNvbW1vbiBjaG9pY2UsIGFuZCDigJxTcGVjdHJhbOKAnSBpcyBhbHNvIG5pY2UuDQojIGRlZmluZSBhIGN1c3RvbSBmdW5jdGlvbiAibW9yZWNvbHMiIHRoYXQgY29udmVydHMgYSBwYWxldHRlIGluIGEgY29udGludW91cyBzZXJpZXMNCiNtb3JlY29scyA8LSBjb2xvclJhbXBQYWxldHRlKG15cGFsZXR0ZSkNCg0KIyMgQ2hlY2sgZGlzdHJpYnV0aW9ucyBvZiBtZWFzdXJlZCBleHByZXNzaW9uIHZhbHVlcyB1c2luZyBsaW5lcGxvdHMNCiNQbG90IGRpc3RyaWJ1dGlvbiBvZiB1bmZpbHRlcmVkIENQTSBjb3VudHMNCnBsb3QoZGVuc2l0eShjb3VudHNfQ1BNbG9nMlssIDFdKSwgDQogICAgIG1haW49IiIsDQogICAgIHhsYWI9ImxvZzIoQ1BNICsgMC4yNSkiLA0KICAgICB5bGFiPSJEZW5zaXR5IiwNCiAgICAgY29sID0gY29sb3JfbGlzdFsxXSwNCiAgICAgeWxpbT1yYW5nZShwcmV0dHkoYygwLCAwLjI1KSkpKQ0KDQpmb3IgKGkgaW4gMjpuY29sKGNvdW50c19DUE1sb2cyKSkgew0KICBsaW5lcyhkZW5zaXR5KGNvdW50c19DUE1sb2cyWywgaV0pLCANCiAgICAgICAgY29sPSBjb2xvcl9saXN0W2ldDQogICAgICAgICkNCiAgdGl0bGUobWFpbiA9IE5VTEwpDQp9DQojIExldCdzIGFkZCBhIGJsdWUgdmVydGljYWwgbGluZSB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBtZWRpYW4gbG9nQ1BNDQphYmxpbmUodj1tZWRpYW4oY291bnRzX0NQTWxvZzIpLGNvbD0iYmx1ZSIpDQojIExldCdzIGFkZCBhIHJlZCB2ZXJ0aWNhbCBsaW5lIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGZpbHRlcmluZyB0aHJlc2hvbGQNCmFibGluZSh2PWxvZzIoZmlsdGVyaW5nX3RocmVzaG9sZCksY29sPSJmaXJlYnJpY2sxIikNCnRpdGxlKCJEZW5zaXR5IGRpc3RyaWJ1dGlvbiBvZiBsb2cyIENQTSBjb3VudHMiKQ0KDQojUGxvdCB0aGUgZGlzdHJpYnV0aW9uIG9mIHRoZSBGSUxURVJFRCBDUE0gY291bnRzDQpwbG90KGRlbnNpdHkoY291bnRzX0NQTWxvZzJfZmlsdGVyZWRbLCBkaW0oY291bnRzX0NQTWxvZzJfZmlsdGVyZWQpWzJdXSksIA0KICAgICBtYWluPSIiLA0KICAgICB4bGFiPSJsb2cyKENQTSArIDAuMjUpIiwNCiAgICAgeWxhYj0iRGVuc2l0eSIsDQogICAgIGNvbCA9IGNvbG9yX2xpc3RbMV0sDQogICAgIHlsaW09cmFuZ2UocHJldHR5KGMoMCwgMC4yNSkpKSwNCiAgICAgeGxpbT1yYW5nZSgtNSwxNSkNCiAgICAgKQ0KDQpmb3IgKGkgaW4gMjpuY29sKGNvdW50c19DUE1sb2cyX2ZpbHRlcmVkKSkgew0KICBsaW5lcyhkZW5zaXR5KGNvdW50c19DUE1sb2cyX2ZpbHRlcmVkWywgaV0pLCANCiAgICAgICAgY29sPSBjb2xvcl9saXN0W2ldDQogICAgICAgICkNCiAgdGl0bGUobWFpbiA9IE5VTEwpDQp9DQojIExldCdzIGFkZCBhIGJsdWUgdmVydGljYWwgbGluZSB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBtZWRpYW4gbG9nQ1BNDQphYmxpbmUodj1tZWRpYW4oY291bnRzX0NQTWxvZzJfZmlsdGVyZWQpLGNvbD0iYmx1ZSIpDQojIExldCdzIGFkZCBhIHJlZCB2ZXJ0aWNhbCBsaW5lIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGZpbHRlcmluZyB0aHJlc2hvbGQNCmFibGluZSh2PWxvZzIoZmlsdGVyaW5nX3RocmVzaG9sZCksY29sPSJmaXJlYnJpY2sxIikNCnRpdGxlKCJEZW5zaXR5IGRpc3RyaWJ1dGlvbiBvZiBGSUxURVJFRCBsb2cyIENQTSBjb3VudHMiKQ0KDQojbGV0J3MgYWxzbyByZXBsb3QgdGhlIGxpYnJhcnkgc2l6ZXMgYnV0IG5vdyBiZWZvcmUgYW5kIGFmdGVyIGZpbHRlcmluZw0KIyBwbG90IHRoZSBsaWJyYXJ5IHNpemVzIG9mIGFsbCB0aGUgc2FtcGxlcw0KYmFycGxvdCgoKERHRV9vYmplY3Qkc2FtcGxlcyRsaWIuc2l6ZS1ER0Vfb2JqZWN0X2ZpbHRlcmVkJHNhbXBsZXMkbGliLnNpemUpL0RHRV9vYmplY3Qkc2FtcGxlcyRsaWIuc2l6ZSkqMTAwLCAgICAgICAgICAgIyBkaXZpZGUgYnkgbWlsbGlvbnMgdG8ganVzdCBwbG90IGluIG1pbGxpb25zDQogICAgICAgIG5hbWVzPWNvbG5hbWVzKERHRV9vYmplY3QpLCAgICAgICAgICAgICAgICAgICMgdXNlIHNhbXBsZSBuYW1lcyBhcyBsYWJlbHMNCiAgICAgICAgbGFzPTIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBUaGUgImxhcyIgYXJndW1lbnQgcm90YXRlcyB0aGUgYXhpcyBuYW1lcw0KICAgICAgICBhbm49RkFMU0UsIA0KICAgICAgICBjZXgubmFtZXM9MC43NSwNCiAgICAgICAgY29sID1jb2xvcl9saXN0LA0KICAgICAgICBib3JkZXIgPSBOQSwNCiAgICAgICAgeWxpbSA9IGMoMCwgMC4xNSkpDQptdGV4dChzaWRlID0gMSwgdGV4dCA9ICIiLCBsaW5lID0gNCkNCm10ZXh0KHNpZGUgPSAyLCB0ZXh0ID0gIlBlcmNlbnRhZ2Ugb2YgY291bnRzIGZpbHRlcmVkIG91dCIsIGxpbmUgPSAzKQ0KdGl0bGUoIlBlcmNlbnRhZ2Ugb2YgY291bnRzIGZpbHRlcmVkIG91dCIpDQoNCiMjIHJlbW92ZSB1bnVzZWQgdmFyaWFibGVzDQojcm0obXlwYWxldHRlLCBpLCBtb3JlY29scywga2VlcCwgYWJvdmVfdGhyZXNob2xkLCBjb3VudHNfQ1BNcmF3KQ0KYGBgDQoNCg0KDQojIyMgTm9ybWFsaXNhdGlvbiBmb3IgY29tcG9zaXRpb24gYmlhcw0KDQojIyMjIyBfX1RNTSBub3JtYWxpc2F0aW9uX18NClRNTSBub3JtYWxpemF0aW9uIGlzIHBlcmZvcm1lZCB0byBlbGltaW5hdGUgY29tcG9zaXRpb24gYmlhc2VzIGJldHdlZW4gbGlicmFyaWVzIChNYXJrIEQuIFJvYmluc29uIGFuZCBPc2hsYWNrIDIwMTApLiBUaGlzIGdlbmVyYXRlcyBhIHNldCBvZiBub3JtYWxpemF0aW9uIGZhY3RvcnMsIHdoZXJlIHRoZSBwcm9kdWN0IG9mIHRoZXNlIGZhY3RvcnMgYW5kIHRoZSBsaWJyYXJ5IHNpemVzIGRlZmluZXMgdGhlIGVmZmVjdGl2ZSBsaWJyYXJ5IHNpemUuIFRoZSBjYWxjTm9ybUZhY3RvcnMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgbm9ybWFsaXphdGlvbiBmYWN0b3JzIGJldHdlZW4gbGlicmFyaWVzLiBUTU0gbm9ybWFsaXNhdGlvbiAoYW5kIG1vc3Qgc2NhbGluZyBub3JtYWxpc2F0aW9uIG1ldGhvZHMpIHNjYWxlIHJlbGF0aXZlIHRvIG9uZSBzYW1wbGUuDQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KIyBBcHBseSBub3JtYWxpc2F0aW9uIHRvIERHRUxpc3Qgb2JqZWN0DQpER0Vfb2JqZWN0X2ZpbHRlcmVkbm9ybWVkIDwtIGNhbGNOb3JtRmFjdG9ycyhER0Vfb2JqZWN0X2ZpbHRlcmVkLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZkNvbHVtbj1tYXRjaChtaW4oREdFX29iamVjdF9maWx0ZXJlZCRzYW1wbGVzJGxpYi5zaXplKSwgREdFX29iamVjdF9maWx0ZXJlZCRzYW1wbGVzJGxpYi5zaXplKSkgI3JlZiB0byB0aGUgc21hbGxlc3QgbGlicmFyeSBzaXplDQoNCiMgVGhpcyB3aWxsIHVwZGF0ZSB0aGUgbm9ybWFsaXNhdGlvbiBmYWN0b3JzIGluIHRoZSBER0VMaXN0IG9iamVjdCAodGhlaXIgZGVmYXVsdCB2YWx1ZXMgYXJlIDEpLiBUYWtlIGEgbG9vayBhdCB0aGUgbm9ybWFsaXNhdGlvbiBmYWN0b3JzIGZvciB0aGVzZSBzYW1wbGVzIChpbiB5W1sic2FtcGxlcyJdXVtbIm5vcm0uZmFjdG9ycyJdXSkuDQpER0Vfb2JqZWN0X2ZpbHRlcmVkbm9ybWVkIFtbInNhbXBsZXMiXV0NCmBgYA0KDQpUaGUgbm9ybWFsaXphdGlvbiBmYWN0b3JzIG11bHRpcGx5IHRvIHVuaXR5IGFjcm9zcyBhbGwgbGlicmFyaWVzLiBBIG5vcm1hbGl6YXRpb24gZmFjdG9yIGJlbG93IG9uZSBpbmRpY2F0ZXMgdGhhdCB0aGUgbGlicmFyeSBzaXplIHdpbGwgYmUgc2NhbGVkIGRvd24sIGFzIHRoZXJlIGlzIG1vcmUgc3VwcHJlc3Npb24gKGkuZS4sIGNvbXBvc2l0aW9uIGJpYXMpIGluIHRoYXQgbGlicmFyeSByZWxhdGl2ZSB0byB0aGUgb3RoZXIgbGlicmFyaWVzLiBUaGlzIGlzIGFsc28gZXF1aXZhbGVudCB0byBzY2FsaW5nIHRoZSBjb3VudHMgdXB3YXJkcyBpbiB0aGF0IHNhbXBsZS4gQ29udmVyc2VseSwgYSBmYWN0b3IgYWJvdmUgb25lIHNjYWxlcyB1cCB0aGUgbGlicmFyeSBzaXplIGFuZCBpcyBlcXVpdmFsZW50IHRvIGRvd25zY2FsaW5nIHRoZSBjb3VudHMuDQoNClBsb3R0aW5nIG1lYW4tZGlmZmVyZW5jZSBwbG90cyBvZiB0aGUgc2FtcGxlcyB3aXRoIGJpZ2dlc3QgYW5kIHdpdGggc21hbGxlc3Qgbm9ybWFsaXNhdGlvbiBmYWN0b3JzLCB3ZSBzaG91bGQgYmUgYWJsZSB0byBzZWUgdGhlIGNvbXBvc2l0aW9uIGJpYXMgcHJvYmxlbS4gV2Ugd2lsbCB1c2UgdGhlIGxvZ2NvdW50cywgd2hpY2ggaGF2ZSBiZWVuIG5vcm1hbGlzZWQgZm9yIGxpYnJhcnkgc2l6ZSwgYnV0IG5vdCBmb3IgY29tcG9zaXRpb24gYmlhcy4NCg0KVGhlIG1lYW4tZGlmZmVyZW5jZSBwbG90cyBzaG93IGF2ZXJhZ2UgZXhwcmVzc2lvbiAobWVhbjogeC1heGlzKSBhZ2FpbnN0IGxvZy1mb2xkLWNoYW5nZXMgKGRpZmZlcmVuY2U6IHktYXhpcykuIElmIHdlIHJlZG8gdGhlc2UgcGxvdHMgdXNpbmcgdGhlIFRNTS1ub3JtYWxpc2VkIGNvdW50cyAobm9ybWFsaXNhdGlvbiBmYWN0b3JzIGFyZSBzdG9yZWQgaW4gdGhlIERHRSBvYmplY3QpLCB3ZSBzaG91bGQgc2VlIHRoZSBjb21wb3NpdGlvbiBiaWFzIHByb2JsZW0gaGFzIGJlZW4gc29sdmVkLg0KDQpgYGB7ciwgZWNobz1GQUxTRX0NCiN0aGUgbWVkaWFuIG9mIGV4cHJlc3Npb24gcmF0aW9zIHNob3VsZCBiZSBjbG9zZXIgdG8gMSAobG9nIGNsb3NlciB0byAwKSBhZnRlciBjb21wb3NpdGlvbmFsIGNvcnJlY3Rpb24NCg0KDQojI2ZvciBzYW1wbGUgd2l0aCBCSUdHRVNUIGNvcnJlY3Rpb24gZmFjdG9yDQojY3JlYXRlIGEgdGFibGUgd2l0aCAgDQoNCnRtcCA8LSBhcy5kYXRhLmZyYW1lKERHRV9vYmplY3RfZmlsdGVyZWRbWyJjb3VudHMiXV1bLG1hdGNoKG1heChER0Vfb2JqZWN0X2ZpbHRlcmVkbm9ybWVkJHNhbXBsZXMkbm9ybS5mYWN0b3JzKSxER0Vfb2JqZWN0X2ZpbHRlcmVkbm9ybWVkJHNhbXBsZXMkbm9ybS5mYWN0b3JzKV0pDQpjb2xuYW1lcyh0bXApIDwtICJyZWZlcmVuY2VzYW1wbGUiDQp0bXAkYXZlcmFnZV9vdGhlcnNhbXBsZXMgPC0gcm93TWVhbnMoREdFX29iamVjdF9maWx0ZXJlZFtbImNvdW50cyJdXVssLW1hdGNoKG1heChER0Vfb2JqZWN0X2ZpbHRlcmVkbm9ybWVkJHNhbXBsZXMkbm9ybS5mYWN0b3JzKSxER0Vfb2JqZWN0X2ZpbHRlcmVkbm9ybWVkJHNhbXBsZXMkbm9ybS5mYWN0b3JzKV0pDQoNCnRtcCRyYXRpbyA8LSB0bXAkcmVmZXJlbmNlc2FtcGxlIC8gdG1wJGF2ZXJhZ2Vfb3RoZXJzYW1wbGVzDQoNCiNjYWxjdWxhdGUgdGhlIG1lZGlhbiBvZiBhbGwgdGhlIGdlbmUgZXhwcmVzc2lvbnMNCnRtcF9iZWZvcmVfMSA8LSB0bXANCm1lZGlhbl9iZWZvcmVfMSA8LSBsb2cyKG1lZGlhbih0bXAkcmF0aW8pKQ0KDQoNCg0KI0FmdGVyIGNvcnJlY3Rpb24NCiNtYW51YWxseSBhcHBseSB0aGUgbm9ybS5mYWN0b3JzIHRvIHRoZSBjb3VudHMNCmNvdW50c19ub3JtYWxpc2VkIDwtIGNwbShER0Vfb2JqZWN0X2ZpbHRlcmVkbm9ybWVkKQ0KDQp0bXAgPC0gYXMuZGF0YS5mcmFtZShjb3VudHNfbm9ybWFsaXNlZFssbWF0Y2gobWF4KERHRV9vYmplY3RfZmlsdGVyZWRub3JtZWQkc2FtcGxlcyRub3JtLmZhY3RvcnMpLERHRV9vYmplY3RfZmlsdGVyZWRub3JtZWQkc2FtcGxlcyRub3JtLmZhY3RvcnMpXSkNCmNvbG5hbWVzKHRtcCkgPC0gInJlZmVyZW5jZXNhbXBsZSINCnRtcCRhdmVyYWdlX290aGVyc2FtcGxlcyA8LSByb3dNZWFucyhjb3VudHNfbm9ybWFsaXNlZFssLW1hdGNoKG1heChER0Vfb2JqZWN0X2ZpbHRlcmVkbm9ybWVkJHNhbXBsZXMkbm9ybS5mYWN0b3JzKSxER0Vfb2JqZWN0X2ZpbHRlcmVkbm9ybWVkJHNhbXBsZXMkbm9ybS5mYWN0b3JzKV0pDQoNCnRtcCRyYXRpbyA8LSB0bXAkcmVmZXJlbmNlc2FtcGxlIC8gdG1wJGF2ZXJhZ2Vfb3RoZXJzYW1wbGVzDQoNCiNjYWxjdWxhdGUgdGhlIG1lZGlhbiBvZiBhbGwgdGhlIGdlbmUgZXhwcmVzc2lvbnMNCnRtcF9hZnRlcl8xIDwtIHRtcA0KbWVkaWFuX2FmdGVyXzEgPC0gbG9nMihtZWRpYW4odG1wJHJhdGlvKSkNCg0KDQojIyMjIyMjIyMjIyMjIyMjIyMNCiMjI2ZvciBzYW1wbGUgd2l0aCBTTUFMTEVTVCBjb3JyZWN0aW9uIGZhY3Rvcg0KI2NyZWF0ZSBhIHRhYmxlIHdpdGggIA0KDQp0bXAgPC0gYXMuZGF0YS5mcmFtZShER0Vfb2JqZWN0X2ZpbHRlcmVkW1siY291bnRzIl1dWyxtYXRjaChtaW4oREdFX29iamVjdF9maWx0ZXJlZG5vcm1lZCRzYW1wbGVzJG5vcm0uZmFjdG9ycyksREdFX29iamVjdF9maWx0ZXJlZG5vcm1lZCRzYW1wbGVzJG5vcm0uZmFjdG9ycyldKQ0KY29sbmFtZXModG1wKSA8LSAicmVmZXJlbmNlc2FtcGxlIg0KdG1wJGF2ZXJhZ2Vfb3RoZXJzYW1wbGVzIDwtIHJvd01lYW5zKERHRV9vYmplY3RfZmlsdGVyZWRbWyJjb3VudHMiXV1bLC1tYXRjaChtaW4oREdFX29iamVjdF9maWx0ZXJlZG5vcm1lZCRzYW1wbGVzJG5vcm0uZmFjdG9ycyksREdFX29iamVjdF9maWx0ZXJlZG5vcm1lZCRzYW1wbGVzJG5vcm0uZmFjdG9ycyldKQ0KDQp0bXAkcmF0aW8gPC0gdG1wJHJlZmVyZW5jZXNhbXBsZSAvIHRtcCRhdmVyYWdlX290aGVyc2FtcGxlcw0KDQojY2FsY3VsYXRlIHRoZSBtZWRpYW4gb2YgYWxsIHRoZSBnZW5lIGV4cHJlc3Npb25zDQp0bXBfYmVmb3JlXzIgPC0gdG1wDQptZWRpYW5fYmVmb3JlXzIgPC0gbG9nMihtZWRpYW4odG1wJHJhdGlvKSkNCg0KDQoNCiNBZnRlciBjb3JyZWN0aW9uDQojbWFudWFsbHkgYXBwbHkgdGhlIG5vcm0uZmFjdG9ycyB0byB0aGUgY291bnRzDQpjb3VudHNfbm9ybWFsaXNlZCA8LSBjcG0oREdFX29iamVjdF9maWx0ZXJlZG5vcm1lZCkNCg0KDQojY291bnRzX25vcm1hbGlzZWQgPC0gYXMuZGF0YS5mcmFtZShER0Vfb2JqZWN0X2ZpbHRlcmVkbm9ybWVkW1siY291bnRzIl1dKQ0KI2ZvciAoaSBpbiAxOmRpbShjb3VudHNfbm9ybWFsaXNlZClbMl0pIHsNCiMgIGNvdW50c19ub3JtYWxpc2VkWyxpXSA8LSBjb3VudHNfbm9ybWFsaXNlZFssaV0vREdFX29iamVjdF9maWx0ZXJlZG5vcm1lZCRzYW1wbGVzJG5vcm0uZmFjdG9yc1tpXQ0KI30NCnRtcCA8LSBhcy5kYXRhLmZyYW1lKGNvdW50c19ub3JtYWxpc2VkWyxtYXRjaChtaW4oREdFX29iamVjdF9maWx0ZXJlZG5vcm1lZCRzYW1wbGVzJG5vcm0uZmFjdG9ycyksREdFX29iamVjdF9maWx0ZXJlZG5vcm1lZCRzYW1wbGVzJG5vcm0uZmFjdG9ycyldKQ0KY29sbmFtZXModG1wKSA8LSAicmVmZXJlbmNlc2FtcGxlIg0KdG1wJGF2ZXJhZ2Vfb3RoZXJzYW1wbGVzIDwtIHJvd01lYW5zKGNvdW50c19ub3JtYWxpc2VkWywtbWF0Y2gobWluKERHRV9vYmplY3RfZmlsdGVyZWRub3JtZWQkc2FtcGxlcyRub3JtLmZhY3RvcnMpLERHRV9vYmplY3RfZmlsdGVyZWRub3JtZWQkc2FtcGxlcyRub3JtLmZhY3RvcnMpXSkNCg0KdG1wJHJhdGlvIDwtIHRtcCRyZWZlcmVuY2VzYW1wbGUgLyB0bXAkYXZlcmFnZV9vdGhlcnNhbXBsZXMNCg0KI2NhbGN1bGF0ZSB0aGUgbWVkaWFuIG9mIGFsbCB0aGUgZ2VuZSBleHByZXNzaW9ucw0KdG1wX2FmdGVyXzIgPC0gdG1wDQptZWRpYW5fYWZ0ZXJfMiA8LSBsb2cyKG1lZGlhbih0bXAkcmF0aW8pKQ0KDQoNCg0KY2F0KCJJbiB0aGUgc2FtcGxlIHdpdGggYmlnZ2VzdCBub3JtLmZhY3RvciAoIiwNCiAgICBjb2xuYW1lcyhER0Vfb2JqZWN0X2ZpbHRlcmVkbm9ybWVkKVttYXRjaChtYXgoREdFX29iamVjdF9maWx0ZXJlZG5vcm1lZCRzYW1wbGVzJG5vcm0uZmFjdG9ycyksREdFX29iamVjdF9maWx0ZXJlZG5vcm1lZCRzYW1wbGVzJG5vcm0uZmFjdG9ycyldLA0KICAgICIpIHRoZSBtZWRpYW4gZXhwcmVzc2lvbiByYXRpbyBjb21wYXJlZCB0byBvdGhlciBzYW1wbGVzIHdlbnQgZnJvbSIsDQogICAgMl5tZWRpYW5fYmVmb3JlXzEsDQogICAgInRvIiwNCiAgICAyXm1lZGlhbl9hZnRlcl8xLA0KICAgICJhZnRlciBUTU0gbm9ybWFsaXNhdGlvbiBcbiBcbiIpDQoNCmNhdCgiSW4gdGhlIHNhbXBsZSB3aXRoIHNtYWxsZXN0IG5vcm0uZmFjdG9yICgiLA0KICAgIGNvbG5hbWVzKERHRV9vYmplY3RfZmlsdGVyZWRub3JtZWQpW21hdGNoKG1pbihER0Vfb2JqZWN0X2ZpbHRlcmVkbm9ybWVkJHNhbXBsZXMkbm9ybS5mYWN0b3JzKSxER0Vfb2JqZWN0X2ZpbHRlcmVkbm9ybWVkJHNhbXBsZXMkbm9ybS5mYWN0b3JzKV0sDQogICAgIikgdGhlIG1lZGlhbiBleHByZXNzaW9uIHJhdGlvIGNvbXBhcmVkIHRvIG90aGVyIHNhbXBsZXMgd2VudCBmcm9tIiwNCiAgICAyXm1lZGlhbl9iZWZvcmVfMiwNCiAgICAidG8iLA0KICAgIDJebWVkaWFuX2FmdGVyXzIsDQogICAgImFmdGVyIFRNTSBub3JtYWxpc2F0aW9uIFxuIikNCmBgYA0KYGBge3IsIGZpZy53aWR0aD0xMiwgZmlnLmhlaWdodD04LCB3YXJuaW5nPUYsIGVjaG89RkFMU0V9DQojc2V0IHNwYWNlIGZvciBmb3VyIHBsb3RzDQpwYXIobWZyb3c9YygyLDMpKQ0KDQojIyBQbG90IHRoZSBNRCBwbG90IGZvciB0aGUgc2FtcGxlIHdpdGggYmlnZ2VzdCBub3JtYWxpc2F0aW9uIGZhY3Rvcg0KIyAuLi4gYmVmb3JlIG5vcm1hbGlzYXRpb24NCnBsb3RNRChER0Vfb2JqZWN0X2ZpbHRlcmVkLA0KICAgICAgIGNvbHVtbiA9IG1hdGNoKG1heChER0Vfb2JqZWN0X2ZpbHRlcmVkbm9ybWVkJHNhbXBsZXMkbm9ybS5mYWN0b3JzKSxER0Vfb2JqZWN0X2ZpbHRlcmVkbm9ybWVkJHNhbXBsZXMkbm9ybS5mYWN0b3JzKSwNCiAgICAgICBtYWluID0gcGFzdGUwKCJTYW1wbGUgd2l0aCBiaWdnZXN0IG5vcm0uZmFjdG9yICgiLGNvbG5hbWVzKERHRV9vYmplY3RfZmlsdGVyZWQpW21hdGNoKG1heChER0Vfb2JqZWN0X2ZpbHRlcmVkbm9ybWVkJHNhbXBsZXMkbm9ybS5mYWN0b3JzKSxER0Vfb2JqZWN0X2ZpbHRlcmVkbm9ybWVkJHNhbXBsZXMkbm9ybS5mYWN0b3JzKV0sICIpXG4gYmVmb3JlIFRNTSBub3JtYWxpc2F0aW9uIiksDQogICAgICAgYmcuY29sPWFscGhhKCJncmF5MjAiLCAwLjEpLA0KICAgICAgICB5bGltPXJhbmdlKHByZXR0eShjKC04LCA4KSkpDQogICAgICAgKSAjIHdpdGhvdXQgY29tcG9zaXRpb24gbm9ybWFsaXNhdGlvbiANCmFibGluZShoPWxvZzIoMSksY29sPSJncmF5MjAiKQ0KYWJsaW5lKGg9bWVkaWFuX2JlZm9yZV8xLGNvbD0ibGlnaHRjb3JhbCIpDQoNCiMgLi4uIGFmdGVyIG5vcm1hbGlzYXRpb24NCnBsb3RNRChER0Vfb2JqZWN0X2ZpbHRlcmVkbm9ybWVkICwNCiAgICAgICBjb2x1bW4gPSBtYXRjaChtYXgoREdFX29iamVjdF9maWx0ZXJlZG5vcm1lZCRzYW1wbGVzJG5vcm0uZmFjdG9ycyksIERHRV9vYmplY3RfZmlsdGVyZWRub3JtZWQkc2FtcGxlcyRub3JtLmZhY3RvcnMpLA0KICAgICAgIG1haW4gPSBwYXN0ZTAoIlNhbXBsZSB3aXRoIGJpZ2dlc3Qgbm9ybS5mYWN0b3IgKCIsY29sbmFtZXMoREdFX29iamVjdF9maWx0ZXJlZG5vcm1lZClbbWF0Y2gobWF4KERHRV9vYmplY3RfZmlsdGVyZWRub3JtZWQkc2FtcGxlcyRub3JtLmZhY3RvcnMpLERHRV9vYmplY3RfZmlsdGVyZWRub3JtZWQkc2FtcGxlcyRub3JtLmZhY3RvcnMpXSwgIilcbiBhZnRlciBUTU0gbm9ybWFsaXNhdGlvbiIpLA0KICAgICAgIGJnLmNvbD1hbHBoYSgiZ3JheTIwIiwgMC4xKSwNCiAgICAgICAgeWxpbT1yYW5nZShwcmV0dHkoYygtOCwgOCkpKQ0KICAgICAgICkgIyBub3JtYWxpc2VkDQphYmxpbmUoaD1sb2cyKDEpLGNvbD0iZ3JheTIwIikNCmFibGluZShoPW1lZGlhbl9hZnRlcl8xLGNvbD0iZG9kZ2VyYmx1ZSIpDQoNCnBsb3QoZGVuc2l0eSh0bXBfYmVmb3JlXzEkcmF0aW8pLCBjb2w9ICJncmF5IiwgeWxpbSA9IGMoMCwyKSwgbWFpbj0iIikNCmxpbmVzKGRlbnNpdHkodG1wX2FmdGVyXzEkcmF0aW8pLCBjb2w9ImRvZGdlcmJsdWUiKQ0KYWJsaW5lKHY9MSxjb2w9ImdyYXkyMCIpDQphYmxpbmUodj0yXm1lZGlhbl9iZWZvcmVfMSxjb2w9ImxpZ2h0Y29yYWwiKQ0KYWJsaW5lKHY9Ml5tZWRpYW5fYWZ0ZXJfMSxjb2w9ImRvZGdlcmJsdWUiKQ0KdGl0bGUoIkRpc3RyaWJ1dGlvbiBvZiByYXRpb3MgXG4gKHRoaXMgc2FtcGxlIHZzIG90aGVycykiKQ0KIy0tLS0tLS0tLS0tLS0NCg0KIyMgUGxvdCB0aGUgTUQgcGxvdCBmb3IgdGhlIHNhbXBsZSB3aXRoIGxvd2VzdCBub3JtYWxpc2F0aW9uIGZhY3Rvcg0KIyAuLi4gYmVmb3JlIG5vcm1hbGlzYXRpb24NCnBsb3RNRChER0Vfb2JqZWN0X2ZpbHRlcmVkLA0KICAgICAgIGNvbHVtbiA9IG1hdGNoKG1pbihER0Vfb2JqZWN0X2ZpbHRlcmVkbm9ybWVkJHNhbXBsZXMkbm9ybS5mYWN0b3JzKSwgREdFX29iamVjdF9maWx0ZXJlZG5vcm1lZCRzYW1wbGVzJG5vcm0uZmFjdG9ycyksDQogICAgICAgbWFpbiA9IHBhc3RlMCgiU2FtcGxlIHdpdGggc21hbGxlc3Qgbm9ybS5mYWN0b3IgKCIsY29sbmFtZXMoREdFX29iamVjdF9maWx0ZXJlZClbbWF0Y2gobWluKERHRV9vYmplY3RfZmlsdGVyZWRub3JtZWQkc2FtcGxlcyRub3JtLmZhY3RvcnMpLERHRV9vYmplY3RfZmlsdGVyZWRub3JtZWQkc2FtcGxlcyRub3JtLmZhY3RvcnMpXSwgIilcbiBiZWZvcmUgVE1NIG5vcm1hbGlzYXRpb24iKSwNCiAgICAgICBiZy5jb2w9YWxwaGEoImdyYXkyMCIsIDAuMSksDQogICAgICAgIHlsaW09cmFuZ2UocHJldHR5KGMoLTgsIDgpKSkNCiAgICAgICApICMgd2l0aG91dCBjb21wb3NpdGlvbiBub3JtYWxpc2F0aW9uIA0KYWJsaW5lKGg9bG9nMigxKSxjb2w9ImdyYXkyMCIpDQphYmxpbmUoaD1tZWRpYW5fYmVmb3JlXzIsY29sPSJsaWdodGNvcmFsIikNCg0KDQojIC4uLiBhZnRlciBub3JtYWxpc2F0aW9uDQpwbG90TUQoREdFX29iamVjdF9maWx0ZXJlZG5vcm1lZCwNCiAgICAgICBjb2x1bW4gPSBtYXRjaChtaW4oREdFX29iamVjdF9maWx0ZXJlZG5vcm1lZCRzYW1wbGVzJG5vcm0uZmFjdG9ycyksIERHRV9vYmplY3RfZmlsdGVyZWRub3JtZWQkc2FtcGxlcyRub3JtLmZhY3RvcnMpLA0KICAgICAgIG1haW4gPSBwYXN0ZTAoIlNhbXBsZSB3aXRoIHNtYWxsZXN0IG5vcm0uZmFjdG9yICgiLGNvbG5hbWVzKERHRV9vYmplY3RfZmlsdGVyZWRub3JtZWQpW21hdGNoKG1pbihER0Vfb2JqZWN0X2ZpbHRlcmVkbm9ybWVkJHNhbXBsZXMkbm9ybS5mYWN0b3JzKSxER0Vfb2JqZWN0X2ZpbHRlcmVkbm9ybWVkJHNhbXBsZXMkbm9ybS5mYWN0b3JzKV0sICIpXG4gYWZ0ZXIgVE1NIG5vcm1hbGlzYXRpb24iKSwNCiAgICAgICBiZy5jb2w9YWxwaGEoImdyYXkyMCIsIDAuMSksDQogICAgICAgIHlsaW09cmFuZ2UocHJldHR5KGMoLTgsIDgpKSkNCiAgICAgICApICNub3JtYWxpc2VkDQphYmxpbmUoaD1sb2cyKDEpLGNvbD0iZ3JheTIwIikNCmFibGluZShoPW1lZGlhbl9hZnRlcl8yLGNvbD0iZG9kZ2VyYmx1ZSIpDQoNCnBsb3QoZGVuc2l0eSh0bXBfYmVmb3JlXzIkcmF0aW8pLCBjb2w9ICJncmF5IiwgeWxpbSA9IGMoMCwyKSwgbWFpbj0iIikNCmxpbmVzKGRlbnNpdHkodG1wX2FmdGVyXzIkcmF0aW8pLCBjb2w9ImRvZGdlcmJsdWUiKQ0KYWJsaW5lKHY9MSxjb2w9ImdyYXkyMCIpDQphYmxpbmUodj0yXm1lZGlhbl9iZWZvcmVfMixjb2w9ImxpZ2h0Y29yYWwiKQ0KYWJsaW5lKHY9Ml5tZWRpYW5fYWZ0ZXJfMixjb2w9ImRvZGdlcmJsdWUiKQ0KdGl0bGUoIkRpc3RyaWJ1dGlvbiBvZiByYXRpb3MgXG4gKHRoaXMgc2FtcGxlIHZzIG90aGVycykiKQ0KDQojcmVtb3ZlIHVudXNlZCB2YXJpYWJsZXMNCnJtKHRtcF9hZnRlcl8xLCB0bXBfYWZ0ZXJfMiwgdG1wX2JlZm9yZV8xLCB0bXBfYmVmb3JlXzIsIGksIG1lZGlhbl9hZnRlcl8xLCBtZWRpYW5fYWZ0ZXJfMiwgbWVkaWFuX2JlZm9yZV8xLCBtZWRpYW5fYmVmb3JlXzIsIGNvdW50c19ub3JtYWxpc2VkKQ0KYGBgDQoNCmBgYHtyLCBlY2hvPUZBTFNFLCBmaWcud2lkdGg9MjAsIGZpZy5oZWlnaHQ9NX0NCiNzZXQgc3BhY2UgZm9yIHR3byBwbG90cw0KcGFyKG1mcm93PWMoMSwyKSkNCg0KIyBQbG90IGxpYnJhcnkgc2l6ZXMganVzdCBiZWZvcmUgbm9ybWFsaXNhdGlvbiAocmVsYXRpdmUgdG8gc21hbGxlc3Qgb25lKQ0KYmFycGxvdChER0Vfb2JqZWN0X2ZpbHRlcmVkJHNhbXBsZXMkbGliLnNpemUvREdFX29iamVjdCRzYW1wbGVzJGxpYi5zaXplW21hdGNoKG1pbihER0Vfb2JqZWN0JHNhbXBsZXMkbGliLnNpemUpLCBER0Vfb2JqZWN0JHNhbXBsZXMkbGliLnNpemUpXSwgICMgdGhpcyB3aWxsIGZpbmQgdGhlIHNhbXBsZSB3aXRoIHRoZSBzbWFsbGVzdCBsaWJyYXJ5IHNpemUNCiAgICAgICAgbmFtZXM9Y29sbmFtZXMoREdFX29iamVjdF9maWx0ZXJlZCksICAgICAgICAgICAgICAgICAgIyB1c2Ugc2FtcGxlIG5hbWVzDQogICAgICAgIGxhcz0yLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgVGhlIGxhcyBhcmd1bWVudCByb3RhdGVzIHRoZSBheGlzIG5hbWVzDQogICAgICAgIGFubj1GQUxTRSwgDQogICAgICAgIGNleC5uYW1lcz0wLjc1LA0KICAgICAgICBjb2wgPSBjb2xvcl9saXN0LA0KICAgICAgICBib3JkZXIgPSBOQSwNCiAgICAgICAgeWxpbT1yYW5nZShwcmV0dHkoYygwLCAxLjc1KSkpDQogICAgICAgICkNCm10ZXh0KHNpZGUgPSAxLCB0ZXh0ID0gIiIsIGxpbmUgPSA0KQ0KbXRleHQoc2lkZSA9IDIsIHRleHQgPSAiTGlicmFyeSBzaXplIChtaWxsaW9ucykiLCBsaW5lID0gMykNCnRpdGxlKCJSZWxhdGl2ZSBsaWJyYXJ5IHNpemUiKQ0KYWJsaW5lKGg9MSxjb2w9ImRvZGdlcmJsdWUiKQ0KDQoNCiNQbG90IGxpYnJhcnkgc2l6ZXMgQUZURVIgbm9ybWFsaXNhdGlvbiAocmVsYXRpdmUgdG8gc21hbGxlc3Qgb25lKQ0KIyBub3RpY2UgdGhhdCBldmVuIHRoZSBub3JtYWxpc2VkIERHRSBvYmplY3QgZG9lcyBub3Qgc3RvcmUgdGhlIGNvbnZlcnRlZCBsaWIuc2l6ZXMgKGxpYi5zaXplICogbm9ybSBmYWN0b3IpDQojIHlvdSBuZWVkIHRvIGNhbGN1bGF0ZSBpdCBleHBsaWNpdGVseSB3aXRoIGVmZmVjdGl2ZUxpYlNpemVzKCkgKG5vdyBnZXROb3JtTGliU2l6ZXMpDQpiYXJwbG90KGdldE5vcm1MaWJTaXplcyhER0Vfb2JqZWN0X2ZpbHRlcmVkbm9ybWVkLCBsb2cgPSBGKS9nZXROb3JtTGliU2l6ZXMoREdFX29iamVjdF9maWx0ZXJlZG5vcm1lZCwgbG9nID0gRilbbWF0Y2gobWluKERHRV9vYmplY3Qkc2FtcGxlcyRsaWIuc2l6ZSksIERHRV9vYmplY3Qkc2FtcGxlcyRsaWIuc2l6ZSldLCAjaS5lLiByZWZlcmVuY2UgdG8gc2FtcGxlIHdpdGggdGhlIHNtYWxsZXN0IGxpYnJhcnkgc2l6ZQ0KICAgICAgICBuYW1lcz1jb2xuYW1lcyhER0Vfb2JqZWN0X2ZpbHRlcmVkbm9ybWVkKSwgICAgICAgICAgICAgICAgICAjIHVzZSBzYW1wbGUgbmFtZXMNCiAgICAgICAgbGFzPTIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBUaGUgbGFzIGFyZ3VtZW50IHJvdGF0ZXMgdGhlIGF4aXMgbmFtZXMNCiAgICAgICAgYW5uPUZBTFNFLCANCiAgICAgICAgY2V4Lm5hbWVzPTAuNzUsDQogICAgICAgIGNvbCA9IGNvbG9yX2xpc3QsDQogICAgICAgIGJvcmRlciA9IE5BLA0KICAgICAgICB5bGltPXJhbmdlKHByZXR0eShjKDAsIDEuNzUpKSkgI290aGVyd2lzZSB5IGF4aXMgdG9vIHNob3J0DQogICAgICAgICkNCm10ZXh0KHNpZGUgPSAxLCB0ZXh0ID0gIiIsIGxpbmUgPSA0KQ0KbXRleHQoc2lkZSA9IDIsIHRleHQgPSAiTGlicmFyeSBzaXplIChtaWxsaW9ucykiLCBsaW5lID0gMykNCnRpdGxlKCJSZWxhdGl2ZSBlZmZlY3RpdmUgbGlicmFyeSBzaXplIikNCmFibGluZShoPTEsY29sPSJkb2RnZXJibHVlIikNCg0KDQojb3VyIERHRSBvYmplY3Qgbm93IGhhcyBhIHdheSBvZiBjYWxjdWxhdGluZyBlZmZlY3RpdmUgbGlicmFyeSBzaXplcw0KYGBgDQoNCg0KDQpgYGB7ciwgZmlnLndpZHRoPTIwLCBmaWcuaGVpZ2h0PTUsIGVjaG89RkFMU0V9DQojIHdlIGNhbiBub3cgcGxvdCBDUE0gY291bnRzIChpLmUuIGNvdW50cyBjb3JyZWN0aW5nIGZvciBsaWJyYXJ5IHNpemUpIGFuZCBub3JtYWxpc2F0aW9uIChpLmUuIHVzZSBub3JtIGZhY3RvcnMpDQojc2V0IHNwYWNlIGZvciBmaXZlIHBsb3RzDQpwYXIobWZyb3c9YygxLDQpKQ0KDQogIA0KIyBHZXQgbG9nMiBjb3VudHMgcGVyIG1pbGxpb24NCmNvdW50c19DUE1sb2cyX2ZpbHRlcmVkbm9ybWVkIDwtIGNwbShER0Vfb2JqZWN0X2ZpbHRlcmVkbm9ybWVkLGxvZz1UUlVFLCBub3JtYWxpemVkLmxpYi5zaXplcz1UUlVFKQ0KDQojIEp1c3QgZm9yIHJlZmVyZW5jZSwgcGxvdCB0aGUgZGlzdHJpYnV0aW9uIG9mIHByZXZpb3VzIHJhdyBkYXRhIGNvdW50cyAoaGVyZSBvbiBsb2cgc2NhbGUpDQpib3hwbG90KGxvZzIoYXMubWF0cml4KERHRV9vYmplY3QpKzAuMjUpLCAjdGhpcyB3aWxsIHVzZSB0aGUgImNvdW50cyIgc2xvdCA9IGRvaW5nIGl0IG9uICJjb3VudHMiDQogICAgICAgIHhsYWI9IiIsIA0KICAgICAgICB5bGFiPSJMb2cyIGNvdW50cyAocmF3IGRhdGEgKyAwLjI1KSIsDQogICAgICAgIGxhcz0yLA0KICAgICAgICBjb2wgPSBjb2xvcl9saXN0LA0KICAgICAgICBib3JkZXIgPSAiZ3JheSIpDQojIExldCdzIGFkZCBhIGJsdWUgaG9yaXpvbnRhbCBsaW5lIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIG1lZGlhbiB2YWx1ZQ0KYWJsaW5lKGg9bG9nMihtZWRpYW4oREdFX29iamVjdCRjb3VudHMpKzAuMjUpLGNvbD0iYmx1ZSIpDQp0aXRsZSgiQm94cGxvdHMgb2YgbG9nY291bnRzIChyYXcgZGF0YSwgdW5ub3JtYWxpc2VkKSIpDQoNCg0KIyBQbG90IHRoZSBkaXN0cmlidXRpb25zIG9mIHRoZSB1bmZpbHRlcmVkIChsb2cyKSBjb3VudHMgcGVyIG1pbGxpb24NCmJveHBsb3QoY291bnRzX0NQTWxvZzIsICAgICAgICAgICAgICAgICAgICAgICAgI2Z1bmN0aW9uIGNwbSgpIGFkZHMgYWxyZWFkeSBhIHNtYWxsIHZhbHVlIHRvIGF2b2lkIGxvZygwKQ0KICAgICAgICB4bGFiPSIiLCANCiAgICAgICAgeWxhYj0iTG9nMiAoY291bnRzIHBlciBtaWxsaW9uICsgMC4yNSkiLA0KICAgICAgICBsYXM9MiwNCiAgICAgICAgY29sID0gY29sb3JfbGlzdCwNCiAgICAgICAgYm9yZGVyID0gImdyYXkiKQ0KIyBMZXQncyBhZGQgYSBibHVlIGhvcml6b250YWwgbGluZSB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBtZWRpYW4gbG9nQ1BNDQphYmxpbmUoaD1tZWRpYW4oY291bnRzX0NQTWxvZzIpLGNvbD0iYmx1ZSIpDQp0aXRsZSgiQm94cGxvdHMgb2YgbG9nQ1BNcyAodW5ub3JtYWxpc2VkKSIpDQoNCg0KIyBQbG90IHRoZSBkaXN0cmlidXRpb25zIG9mIHRoZSBGSUxURVJFRCAobG9nMikgY291bnRzIHBlciBtaWxsaW9uDQpib3hwbG90KGNvdW50c19DUE1sb2cyX2ZpbHRlcmVkLCAgICAgICAgICAgICAgICAgI2Z1bmN0aW9uIGNwbSgpIGFkZHMgYWxyZWFkeSBhIHNtYWxsIHZhbHVlIHRvIGF2b2lkIGxvZygwKQ0KICAgICAgICB4bGFiPSIiLCANCiAgICAgICAgeWxhYj0iTG9nMiAoY291bnRzIHBlciBtaWxsaW9uICsgMC4yNSkiLA0KICAgICAgICBsYXM9MiwNCiAgICAgICAgY29sID0gY29sb3JfbGlzdCwNCiAgICAgICAgYm9yZGVyID0gImdyYXkiKQ0KIyBMZXQncyBhZGQgYSBibHVlIGhvcml6b250YWwgbGluZSB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBtZWRpYW4gbG9nQ1BNDQphYmxpbmUoaD1tZWRpYW4oY291bnRzX0NQTWxvZzJfZmlsdGVyZWQpLGNvbD0iYmx1ZSIpDQp0aXRsZSgiQm94cGxvdHMgb2YgRklMVEVSRUQgbG9nQ1BNcyAodW5ub3JtYWxpc2VkKSIpDQoNCiMgUGxvdCB0aGUgZGlzdHJpYnV0aW9ucyBvZiB0aGUgZmlsdGVyZWQsIE5PUk1BTElTRUQgKGxvZzIpIGNvdW50cyBwZXIgbWlsbGlvbg0KYm94cGxvdChjb3VudHNfQ1BNbG9nMl9maWx0ZXJlZG5vcm1lZCwgICAgICAgICAgICAgICAgICNmdW5jdGlvbiBjcG0oKSBhZGRzIGFscmVhZHkgYSBzbWFsbCB2YWx1ZSB0byBhdm9pZCBsb2coMCkNCiAgICAgICAgeGxhYj0iIiwgDQogICAgICAgIHlsYWI9IkxvZzIgKGNvdW50cyBwZXIgbWlsbGlvbiArIDAuMjUpIiwNCiAgICAgICAgbGFzPTIsDQogICAgICAgIGNvbCA9IGNvbG9yX2xpc3QsDQogICAgICAgIGJvcmRlciA9ICJncmF5IikNCiMgTGV0J3MgYWRkIGEgYmx1ZSBob3Jpem9udGFsIGxpbmUgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgbWVkaWFuIGxvZ0NQTQ0KYWJsaW5lKGg9bWVkaWFuKGNvdW50c19DUE1sb2cyX2ZpbHRlcmVkbm9ybWVkKSxjb2w9ImJsdWUiKQ0KdGl0bGUoIkJveHBsb3RzIG9mIGZpbHRlcmVkIGxvZ0NQTXMgKG5vcm1hbGlzZWQpIikNCmBgYA0KDQpgYGB7ciwgZmlnLndpZHRoPTIwLCBmaWcuaGVpZ2h0PTUsIHdhcm5pbmc9RkFMU0UsIGVjaG89RkFMU0V9DQojIyBQbG90IFJMRSAocmVsYXRpdmUgZXhwcmVzc2lvbiBsZXZlbCkgdG8gY2hlY2sgZWZmZWN0aXZlbmVzcyBvZiBub3JtYWxpc2F0aW9uDQojIGEgUkxFIHBsb3QgaXMsIG9uIGxvZyBjb3VudHMsIHRoZSBkZXZpYXRpb24gb2YgZWFjaCBnZW5lIHJlY29yZGluZywgdG8gaXRzIGF2ZXJhZ2UgYWNyb3NzIGFsbCBzYW1wbGVzDQoNCiMjIFJBVyBDT1VOVFMNClJMRV9jb3VudHNfZm9yZ2dwbG90IDwtIHN3ZWVwKGxvZzIoY291bnRzKzAuMjUpLCBNQVJHSU49MSwgU1RBVFM9IHJvd01lYW5zKGxvZzIoY291bnRzKzAuMjUpKSkNClJMRV9jb3VudHNfZm9yZ2dwbG90JGdlbmVzIDwtIHJvdy5uYW1lcyhSTEVfY291bnRzX2ZvcmdncGxvdCkNClJMRV9jb3VudHNfZm9yZ2dwbG90ICA8LSBSTEVfY291bnRzX2ZvcmdncGxvdCAgJT4lICBwaXZvdF9sb25nZXIoLWdlbmVzLCBuYW1lc190byA9ICJDb25kaXRpb24iLCB2YWx1ZXNfdG8gPSAiZGV2aWF0aW9ucyIpDQojbG9jayBpbiB0aGUgb3JkZXIgb2YgdGhlIHNhbXBsZXMsIG9yIHRoZXkgd2lsbCBiZSByZWFycmFuZ2VkIGR1cmluZyBwbG90dGluZw0KUkxFX2NvdW50c19mb3JnZ3Bsb3QkQ29uZGl0aW9uIDwtIGZhY3RvcihSTEVfY291bnRzX2ZvcmdncGxvdCRDb25kaXRpb24sIGxldmVscyA9IG9yZGVyZWRfbGV2ZWxzKQ0KDQpwbG90MSA8LSBnZ3Bsb3QoUkxFX2NvdW50c19mb3JnZ3Bsb3QsIGFlcyh4PUNvbmRpdGlvbiwgeT1kZXZpYXRpb25zLCBmaWxsPUNvbmRpdGlvbikpICsNCiAgZ2VvbV92aW9saW4odHJpbT1GQUxTRSkrDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1jb2xvcl9saXN0KSsNCiAgI2dlb21faml0dGVyKHNoYXBlPTE2LCBwb3NpdGlvbj1wb3NpdGlvbl9qaXR0ZXIoMC4yKSwgYWxwaGE9MC4wMSkgKw0KICAjZ2VvbV9ib3hwbG90KHdpZHRoPTAuMSwgb3V0bGllci5jb2xvciA9ICJibGFjayIsIG91dGxpZXIuYWxwaGE9MC4wMSkrDQogIHN0YXRfc3VtbWFyeShmdW49bWVkaWFuLCBwY2g9MjEsIHNpemU9MC41LCBjb2xvcj0iYmxhY2siLCBmaWxsPSJkb2RnZXJibHVlIikrDQogIHRoZW1lX2NsYXNzaWMoKSsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJub25lIiwgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwgdmp1c3QgPSAwLjUsIGhqdXN0PTEpKSsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0PTAsIGxpbmV0eXBlPSJsb25nZGFzaCIsIGNvbG9yID0gImRvZGdlcmJsdWUiLCBzaXplPTAuNSkrDQogIHhsYWIoIiIpICsgDQogIHlsYWIoIlJlbGF0aXZlIGxvZzIgZXhwcmVzc2lvbiBvZiBlYWNoIGdlbmUgKGV4cHJlc3Npb24tbWVhbikiKSsNCiAgZ2d0aXRsZSgiUmVsYXRpdmUgTGV2ZWxzIG9mIEV4cHJlc3Npb246IHJhd2NvdW50cyIpKw0KICBOVUxMDQoNCiMjIENQTQ0KDQp0bXAgPC1hcy5kYXRhLmZyYW1lKDJeKGNvdW50c19DUE1sb2cyLTAuMjUpKQ0KUkxFX2xvZ0NQTV9mb3JnZ3Bsb3QgPC0gc3dlZXAobG9nMih0bXApLCBNQVJHSU49MSwgU1RBVFM9IHJvd01lYW5zKGxvZzIodG1wKSkpIA0KUkxFX2xvZ0NQTV9mb3JnZ3Bsb3QkZ2VuZXMgPC0gcm93Lm5hbWVzKGFzLmRhdGEuZnJhbWUoUkxFX2xvZ0NQTV9mb3JnZ3Bsb3QpKQ0KUkxFX2xvZ0NQTV9mb3JnZ3Bsb3QgPC0gUkxFX2xvZ0NQTV9mb3JnZ3Bsb3QgICU+JSAgcGl2b3RfbG9uZ2VyKC1nZW5lcywgbmFtZXNfdG8gPSAiQ29uZGl0aW9uIiwgdmFsdWVzX3RvID0gImRldmlhdGlvbnMiKQ0KI2xvY2sgaW4gdGhlIG9yZGVyIG9mIHRoZSBzYW1wbGVzLCBvciB0aGV5IHdpbGwgYmUgcmVhcnJhbmdlZCBkdXJpbmcgcGxvdHRpbmcNClJMRV9sb2dDUE1fZm9yZ2dwbG90JENvbmRpdGlvbiA8LSBmYWN0b3IoUkxFX2xvZ0NQTV9mb3JnZ3Bsb3QkQ29uZGl0aW9uLCBsZXZlbHMgPSAgb3JkZXJlZF9sZXZlbHMpDQoNCnBsb3QyIDwtIGdncGxvdChSTEVfbG9nQ1BNX2ZvcmdncGxvdCwgYWVzKHg9Q29uZGl0aW9uLCB5PWRldmlhdGlvbnMsIGZpbGw9Q29uZGl0aW9uKSkgKw0KICBnZW9tX3Zpb2xpbih0cmltPUZBTFNFKSsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPWNvbG9yX2xpc3QpKw0KICAjZ2VvbV9qaXR0ZXIoc2hhcGU9MTYsIHBvc2l0aW9uPXBvc2l0aW9uX2ppdHRlcigwLjIpLCBhbHBoYT0wLjAxKSArDQogICNnZW9tX2JveHBsb3Qod2lkdGg9MC4xLCBvdXRsaWVyLmNvbG9yID0gImJsYWNrIiwgb3V0bGllci5hbHBoYT0wLjAxKSsNCiAgc3RhdF9zdW1tYXJ5KGZ1bj1tZWRpYW4sIHBjaD0yMSwgc2l6ZT0wLjUsIGNvbG9yPSJibGFjayIsIGZpbGw9ImRvZGdlcmJsdWUiKSsNCiAgdGhlbWVfY2xhc3NpYygpKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb249Im5vbmUiLCBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCB2anVzdCA9IDAuNSwgaGp1c3Q9MSkpKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQ9MCwgbGluZXR5cGU9ImxvbmdkYXNoIiwgY29sb3IgPSAiZG9kZ2VyYmx1ZSIsIHNpemU9MC41KSsNCiAgeWxpbShjKC0xMCwxMCkpKw0KICB4bGFiKCIiKSArIA0KICB5bGFiKCJSZWxhdGl2ZSBsb2cyIGV4cHJlc3Npb24gb2YgZWFjaCBnZW5lIChleHByZXNzaW9uLW1lYW4pIikrDQogIGdndGl0bGUoIlJlbGF0aXZlIExldmVscyBvZiBFeHByZXNzaW9uOiBsb2dDUE1zIikrDQogIE5VTEwNCg0KIyMgRklMVEVSRUQgQ1BNDQoNCnRtcCA8LWFzLmRhdGEuZnJhbWUoMl4oY291bnRzX0NQTWxvZzJfZmlsdGVyZWQtMC4yNSkpDQpSTEVfbG9nQ1BNZmlsdGVyZWRfZm9yZ2dwbG90IDwtIHN3ZWVwKGxvZzIodG1wKSwgTUFSR0lOPTEsIFNUQVRTPSByb3dNZWFucyhsb2cyKHRtcCkpKSANClJMRV9sb2dDUE1maWx0ZXJlZF9mb3JnZ3Bsb3QkZ2VuZXMgPC0gcm93Lm5hbWVzKGFzLmRhdGEuZnJhbWUoUkxFX2xvZ0NQTWZpbHRlcmVkX2ZvcmdncGxvdCkpDQpSTEVfbG9nQ1BNZmlsdGVyZWRfZm9yZ2dwbG90IDwtIFJMRV9sb2dDUE1maWx0ZXJlZF9mb3JnZ3Bsb3QgICU+JSAgcGl2b3RfbG9uZ2VyKC1nZW5lcywgbmFtZXNfdG8gPSAiQ29uZGl0aW9uIiwgdmFsdWVzX3RvID0gImRldmlhdGlvbnMiKQ0KI2xvY2sgaW4gdGhlIG9yZGVyIG9mIHRoZSBzYW1wbGVzLCBvciB0aGV5IHdpbGwgYmUgcmVhcnJhbmdlZCBkdXJpbmcgcGxvdHRpbmcNClJMRV9sb2dDUE1maWx0ZXJlZF9mb3JnZ3Bsb3QkQ29uZGl0aW9uIDwtIGZhY3RvcihSTEVfbG9nQ1BNZmlsdGVyZWRfZm9yZ2dwbG90JENvbmRpdGlvbiwgbGV2ZWxzID0gIG9yZGVyZWRfbGV2ZWxzKQ0KDQpwbG90MyA8LSBnZ3Bsb3QoUkxFX2xvZ0NQTWZpbHRlcmVkX2ZvcmdncGxvdCwgYWVzKHg9Q29uZGl0aW9uLCB5PWRldmlhdGlvbnMsIGZpbGw9Q29uZGl0aW9uKSkgKw0KICBnZW9tX3Zpb2xpbih0cmltPUZBTFNFKSsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPWNvbG9yX2xpc3QpKw0KICAjZ2VvbV9qaXR0ZXIoc2hhcGU9MTYsIHBvc2l0aW9uPXBvc2l0aW9uX2ppdHRlcigwLjIpLCBhbHBoYT0wLjAxKSArDQogICNnZW9tX2JveHBsb3Qod2lkdGg9MC4xLCBvdXRsaWVyLmNvbG9yID0gImJsYWNrIiwgb3V0bGllci5hbHBoYT0wLjAxKSsNCiAgc3RhdF9zdW1tYXJ5KGZ1bj1tZWRpYW4sIHBjaD0yMSwgc2l6ZT0wLjUsIGNvbG9yPSJibGFjayIsIGZpbGw9ImRvZGdlcmJsdWUiKSsNCiAgdGhlbWVfY2xhc3NpYygpKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb249Im5vbmUiLCBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCB2anVzdCA9IDAuNSwgaGp1c3Q9MSkpKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQ9MCwgbGluZXR5cGU9ImxvbmdkYXNoIiwgY29sb3IgPSAiZG9kZ2VyYmx1ZSIsIHNpemU9MC41KSsNCiAgeWxpbShjKC0xMCwxMCkpKw0KICB4bGFiKCIiKSArIA0KICB5bGFiKCJSZWxhdGl2ZSBsb2cyIGV4cHJlc3Npb24gb2YgZWFjaCBnZW5lIChleHByZXNzaW9uLW1lYW4pIikrDQogIGdndGl0bGUoIlJlbGF0aXZlIExldmVscyBvZiBFeHByZXNzaW9uOiBmaWx0ZXJlZCBsb2dDUE1zIikrDQogIE5VTEwNCg0KIyMgRklMVEVSRUQsIFRNTSBOT1JNQUxJU0VELCBDUE0NCnRtcCA8LWFzLmRhdGEuZnJhbWUoMl4oY291bnRzX0NQTWxvZzJfZmlsdGVyZWRub3JtZWQtMC4yNSkpDQpSTEVfbG9nQ1BNZmlsdGVyZWRub3JtZWRfZm9yZ2dwbG90IDwtIHN3ZWVwKGxvZzIodG1wKSwgTUFSR0lOPTEsIFNUQVRTPSByb3dNZWFucyhsb2cyKHRtcCkpKSANClJMRV9sb2dDUE1maWx0ZXJlZG5vcm1lZF9mb3JnZ3Bsb3QkZ2VuZXMgPC0gcm93Lm5hbWVzKGFzLmRhdGEuZnJhbWUoUkxFX2xvZ0NQTWZpbHRlcmVkbm9ybWVkX2ZvcmdncGxvdCkpDQpSTEVfbG9nQ1BNZmlsdGVyZWRub3JtZWRfZm9yZ2dwbG90IDwtIFJMRV9sb2dDUE1maWx0ZXJlZG5vcm1lZF9mb3JnZ3Bsb3QgICU+JSAgcGl2b3RfbG9uZ2VyKC1nZW5lcywgbmFtZXNfdG8gPSAiQ29uZGl0aW9uIiwgdmFsdWVzX3RvID0gImRldmlhdGlvbnMiKQ0KI2xvY2sgaW4gdGhlIG9yZGVyIG9mIHRoZSBzYW1wbGVzLCBvciB0aGV5IHdpbGwgYmUgcmVhcnJhbmdlZCBkdXJpbmcgcGxvdHRpbmcNClJMRV9sb2dDUE1maWx0ZXJlZG5vcm1lZF9mb3JnZ3Bsb3QkQ29uZGl0aW9uIDwtIGZhY3RvcihSTEVfbG9nQ1BNZmlsdGVyZWRub3JtZWRfZm9yZ2dwbG90JENvbmRpdGlvbiwgbGV2ZWxzID0gb3JkZXJlZF9sZXZlbHMpDQoNCnBsb3Q0IDwtIGdncGxvdChSTEVfbG9nQ1BNZmlsdGVyZWRub3JtZWRfZm9yZ2dwbG90LCBhZXMoeD1Db25kaXRpb24sIHk9ZGV2aWF0aW9ucywgZmlsbD1Db25kaXRpb24pKSArDQogIGdlb21fdmlvbGluKHRyaW09RkFMU0UpKw0KICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9Y29sb3JfbGlzdCkrDQogICNnZW9tX2ppdHRlcihzaGFwZT0xNiwgcG9zaXRpb249cG9zaXRpb25faml0dGVyKDAuMiksIGFscGhhPTAuMDEpICsNCiAgI2dlb21fYm94cGxvdCh3aWR0aD0wLjEsIG91dGxpZXIuY29sb3IgPSAiYmxhY2siLCBvdXRsaWVyLmFscGhhPTAuMDEpKw0KICBzdGF0X3N1bW1hcnkoZnVuPW1lZGlhbiwgcGNoPTIxLCBzaXplPTAuNSwgY29sb3I9ImJsYWNrIiwgZmlsbD0iZG9kZ2VyYmx1ZSIpKw0KICB0aGVtZV9jbGFzc2ljKCkrDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIHZqdXN0ID0gMC41LCBoanVzdD0xKSkrDQogIGdlb21faGxpbmUoeWludGVyY2VwdD0wLCBsaW5ldHlwZT0ibG9uZ2Rhc2giLCBjb2xvciA9ICJkb2RnZXJibHVlIiwgc2l6ZT0wLjUpKw0KICB5bGltKGMoLTEwLDEwKSkrDQogIHhsYWIoIiIpICsgDQogIHlsYWIoIlJlbGF0aXZlIGxvZzIgZXhwcmVzc2lvbiBvZiBlYWNoIGdlbmUgKGV4cHJlc3Npb24tbWVhbikiKSsNCiAgZ2d0aXRsZSgiUmVsYXRpdmUgTGV2ZWxzIG9mIEV4cHJlc3Npb246IGZpbHRlcmVkIGxvZ0NQTXMsIFRNTS1ub3JtYWxpc2VkIikrDQogIE5VTEwNCg0KZ3JpZC5hcnJhbmdlKHBsb3QxLCBwbG90MiwgcGxvdDMsIHBsb3Q0LCBuY29sPTQsIG5yb3c9MSkNCg0KI3JlbW92ZSB1bnVzZWQgdmFyaWFibGVzDQpybSh0bXAsIFJMRV9jb3VudHNfZm9yZ2dwbG90LCBSTEVfbG9nQ1BNX2ZvcmdncGxvdCwgUkxFX2xvZ0NQTWZpbHRlcmVkX2ZvcmdncGxvdCwgUkxFX2xvZ0NQTWZpbHRlcmVkbm9ybWVkX2ZvcmdncGxvdCwgcGxvdDEsIHBsb3QyLCBwbG90MywgcGxvdDQpDQpgYGANCg0KDQojIyMjIyBfX0Rlc2VxMl9fDQpERVNlcTIgaW50ZXJuYWxseSBjb3JyZWN0cyBjb3VudHMgZm9yIHNlcXVlbmNpbmcgZGVwdGggKGkuZS4gd2hhdCB3ZSBkaWQgYnkgdXNpbmcgQ1BNKSBhbmQgUk5BIGNvbXBvc2l0aW9uYWwgYmlhcyAobm9ybSkgdXNpbmcgTWVkaWFuIG9mIHJhdGlvcyBtZXRob2QuIFRvIHJ1biB0aGlzIG1ldGhvZCwgd2UgY3JlYXRlIGEgREVTZXEyIG9iamVjdCB1c2luZyB0aGUgY291bnQgZGF0YSBhbmQgbWV0YWRhdGEuDQoNCmBgYHtyLCBmaWcud2lkdGg9MjAsIGZpZy5oZWlnaHQ9NSwgd2FybmluZz1GQUxTRSwgZWNobz1GQUxTRX0NCiNjb252ZXJ0IGxhdmVsIGRhdGEgc2xvdCB0byBmYWN0b3IgKGlmIG5vdCBhbHJlYWR5KQ0KI0RHRV9vYmplY3RbWyJzYW1wbGVzIl1dW1sic3RhZ2UiXV0gPC0gZmFjdG9yKERHRV9vYmplY3RbWyJzYW1wbGVzIl1dW1sic3RhZ2UiXV0pDQoNCiMjIGNyZWF0ZSBhIERlU2VxMiBvYmplY3QuIFdlIGNhbiB1c2UgdGhlIG9yaWdpbmFsIGNvdW50IGRhdGEgKHVuZmlsdGVyZWQsIHVuLW5vcm1hbGlzZWQpIGJlY2F1c2UgdGhpcyBpcyBkb25lIGF1dG9tYXRpY2FsbHkgYnkgdGhlIGZ1bmN0aW9uLiBTdGFydGluZyB3aXRoIHRoZSBmaWx0ZXJlZCBvYmplY3Qgd2lsbCBoZWxwIHRob3VnaC4gDQpEZVNlcTJfb2JqZWN0IDwtIERFU2VxRGF0YVNldEZyb21NYXRyaXgoY291bnREYXRhPXJvdW5kKERHRV9vYmplY3RfZmlsdGVyZWRbWyJjb3VudHMiXV0pLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbERhdGE9REdFX29iamVjdF9maWx0ZXJlZFtbInNhbXBsZXMiXV0sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzaWduPX50cmVhdG1lbnQpDQojIGNhbGN1bGF0ZSB0aGUgc2l6ZSBmYWN0b3JzIG9mIGVhY2ggc2FtcGxlICh0aGVzZSBhcmUgc3RvcmVkIGluIERlU2VxMl9vYmplY3RAY29sRGF0YUBsaXN0RGF0YVtbInNpemVGYWN0b3IiXV0pDQpEZVNlcTJfb2JqZWN0IDwtIERFU2VxMjo6ZXN0aW1hdGVTaXplRmFjdG9ycyhEZVNlcTJfb2JqZWN0LHR5cGU9InJhdGlvIikgI3NpemUgZmFjdG9ycyBpbiBEZVNlcTIgYXJlIG5vdCByZWxhdGl2ZSB0byBvbmUgc2FtcGxlIA0KIyBhcHBseSB0aGUgbm9ybWFsaXNhdGlvbiB0byB5b3VyIGNvdW50cw0KY291bnRzX0RlU2VxMiA8LSBjb3VudHMoRGVTZXEyX29iamVjdCxub3JtYWxpemVkPVRSVUUpICN0aGUgbm9ybWFsaXNhdGlvbiBwZXJmb3JtZWQgaGVyZSBpbmNsdWRlcyB0aGUgY29ycmVjdGlvbiBmb3IgbGlicmFyeSBzaXplIHRoYXQgd2Ugd2VyZSBkb2luZyB3aXRoIENQTSB0cmFuc2Zvcm0sIGFzIHdlbGwgYXMgdGhlIHByb3BlciAibm9ybWFsaXNhdGlvbiIgYWdhaW5zdCBjb21wb3NpdGlvbmFsIGJpYXMgYmFzZWQgb24gTWVkaWFuIG9mIFJhdGlvbnMgbWV0aG9kcw0KDQojIyMjIyMjIHBsb3R0aW5nDQojc2V0IHNwYWNlIGZvciA1IHBsb3RzDQpwYXIobWZyb3c9YygxLDUpKQ0KDQojIEp1c3QgZm9yIHJlZmVyZW5jZSwgcGxvdCB0aGUgZGlzdHJpYnV0aW9uIG9mIHByZXZpb3VzIHJhdyBkYXRhIGNvdW50cyAoaGVyZSBvbiBsb2cgc2NhbGUpDQpib3hwbG90KGxvZzIoYXMubWF0cml4KERHRV9vYmplY3QpKzAuMjUpLCAjdGhpcyB3aWxsIHVzZSB0aGUgImNvdW50cyIgc2xvdCA9IGRvaW5nIGl0IG9uICJjb3VudHMiDQogICAgICAgIHhsYWI9IiIsIA0KICAgICAgICB5bGFiPSJMb2cyIGNvdW50cyAocmF3IGRhdGEgKyAwLjI1ICkiLA0KICAgICAgICBsYXM9MiwNCiAgICAgICAgY29sID0gY29sb3JfbGlzdCwNCiAgICAgICAgYm9yZGVyID0gImdyYXkiKQ0KIyBMZXQncyBhZGQgYSBibHVlIGhvcml6b250YWwgbGluZSB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBtZWRpYW4gdmFsdWUNCmFibGluZShoPWxvZzIobWVkaWFuKERHRV9vYmplY3QkY291bnRzKSswLjI1KSxjb2w9ImJsdWUiKQ0KdGl0bGUoIkJveHBsb3RzIG9mIGxvZ2NvdW50cyAocmF3IGRhdGEsIHVubm9ybWFsaXNlZCkiKQ0KDQoNCiMgUGxvdCB0aGUgZGlzdHJpYnV0aW9ucyBvZiB0aGUgdW5maWx0ZXJlZCAobG9nMikgY291bnRzIHBlciBtaWxsaW9uDQpib3hwbG90KGNvdW50c19DUE1sb2cyLCAgICAgICAgICAgICAgICAgICAgICAgICNmdW5jdGlvbiBjcG0oKSBhZGRzIGFscmVhZHkgYSBzbWFsbCB2YWx1ZSB0byBhdm9pZCBsb2coMCkNCiAgICAgICAgeGxhYj0iIiwgDQogICAgICAgIHlsYWI9IkxvZzIgKGNvdW50cyBwZXIgbWlsbGlvbiArIDAuMjUpIiwNCiAgICAgICAgbGFzPTIsDQogICAgICAgIGNvbCA9IGNvbG9yX2xpc3QsDQogICAgICAgIGJvcmRlciA9ICJncmF5IikNCiMgTGV0J3MgYWRkIGEgYmx1ZSBob3Jpem9udGFsIGxpbmUgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgbWVkaWFuIGxvZ0NQTQ0KYWJsaW5lKGg9bWVkaWFuKGNvdW50c19DUE1sb2cyKSxjb2w9ImJsdWUiKQ0KdGl0bGUoIkJveHBsb3RzIG9mIGxvZ0NQTXMgKHVubm9ybWFsaXNlZCkiKQ0KDQoNCiMgUGxvdCB0aGUgZGlzdHJpYnV0aW9ucyBvZiB0aGUgZmlsdGVyZWQgKGxvZzIpIGNvdW50cyBwZXIgbWlsbGlvbg0KYm94cGxvdChjb3VudHNfQ1BNbG9nMl9maWx0ZXJlZCwgICAgICAgICAgICAgICAgICNmdW5jdGlvbiBjcG0oKSBhZGRzIGFscmVhZHkgYSBzbWFsbCB2YWx1ZSB0byBhdm9pZCBsb2coMCkNCiAgICAgICAgeGxhYj0iIiwgDQogICAgICAgIHlsYWI9IkxvZzIgKGNvdW50cyBwZXIgbWlsbGlvbiArIDAuMjUpIiwNCiAgICAgICAgbGFzPTIsDQogICAgICAgIGNvbCA9IGNvbG9yX2xpc3QsDQogICAgICAgIGJvcmRlciA9ICJncmF5IikNCiMgTGV0J3MgYWRkIGEgYmx1ZSBob3Jpem9udGFsIGxpbmUgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgbWVkaWFuIGxvZ0NQTQ0KYWJsaW5lKGg9bWVkaWFuKGNvdW50c19DUE1sb2cyX2ZpbHRlcmVkKSxjb2w9ImJsdWUiKQ0KdGl0bGUoIkJveHBsb3RzIG9mIEZJTFRFUkVEIGxvZ0NQTXMgKHVubm9ybWFsaXNlZCkiKQ0KDQojIFBsb3QgdGhlIGRpc3RyaWJ1dGlvbnMgb2YgdGhlIGZpbHRlcmVkLCBOT1JNQUxJU0VEIChsb2cyKSBjb3VudHMgcGVyIG1pbGxpb24NCmJveHBsb3QoY291bnRzX0NQTWxvZzJfZmlsdGVyZWRub3JtZWQsICAgICAgICAgICAgICAgICAjZnVuY3Rpb24gY3BtKCkgYWRkcyBhbHJlYWR5IGEgc21hbGwgdmFsdWUgdG8gYXZvaWQgbG9nKDApDQogICAgICAgIHhsYWI9IiIsIA0KICAgICAgICB5bGFiPSJMb2cyIChjb3VudHMgcGVyIG1pbGxpb24gKyAwLjI1KSIsDQogICAgICAgIGxhcz0yLA0KICAgICAgICBjb2wgPSBjb2xvcl9saXN0LA0KICAgICAgICBib3JkZXIgPSAiZ3JheSIpDQojIExldCdzIGFkZCBhIGJsdWUgaG9yaXpvbnRhbCBsaW5lIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIG1lZGlhbiBsb2dDUE0NCmFibGluZShoPW1lZGlhbihjb3VudHNfQ1BNbG9nMl9maWx0ZXJlZG5vcm1lZCksY29sPSJibHVlIikNCnRpdGxlKCJCb3hwbG90cyBvZiBmaWx0ZXJlZCBsb2dDUE1zIChub3JtYWxpc2VkKSIpDQoNCiMgUGxvdCB0aGUgZGlzdHJpYnV0aW9ucyBvZiB0aGUgZmlsdGVyZWQsIERlU2VxMiBub3JtYWxpc2VkIGNvdW50cw0KYm94cGxvdChsb2cyKGFzLm1hdHJpeChjb3VudHNfRGVTZXEyKSswLjI1KSwgDQogICAgICAgIHhsYWI9IiIsIA0KICAgICAgICB5bGFiPSJMb2cyIChub3JtYWxpc2VkIGNvdW50cyArIDAuMjUpIiwNCiAgICAgICAgbGFzPTIsDQogICAgICAgIGNvbCA9IGNvbG9yX2xpc3QsDQogICAgICAgIGJvcmRlciA9ICJncmF5IikNCiMgTGV0J3MgYWRkIGEgYmx1ZSBob3Jpem9udGFsIGxpbmUgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgbWVkaWFuIGxvZ0NQTQ0KYWJsaW5lKGg9bG9nMihtZWRpYW4oYXMubWF0cml4KGNvdW50c19EZVNlcTIpKSswLjI1KSxjb2w9ImJsdWUiKQ0KdGl0bGUoIkJveHBsb3RzIG9mIERlU2VxMiBjb3VudHMgKGZpbHRlcmVkKSIpDQpgYGANCg0KYGBge3IsIGZpZy53aWR0aD0yMCwgZmlnLmhlaWdodD00LCB3YXJuaW5nPUZBTFNFLCBlY2hvPUZBTFNFfQ0KIyMgUGxvdCBSTEUgKHJlbGF0aXZlIGV4cHJlc3Npb24gbGV2ZWwpIHRvIGNoZWNrIGVmZmVjdGl2ZW5lc3Mgb2Ygbm9ybWFsaXNhdGlvbg0KIyBhIFJMRSBwbG90IGlzLCBvbiBsb2cgY291bnRzLCB0aGUgZGV2aWF0aW9uIG9mIGVhY2ggZ2VuZSByZWNvcmRpbmcsIHRvIGl0cyBhdmVyYWdlIGFjcm9zcyBhbGwgc2FtcGxlcw0KDQojIyBSQVcgQ09VTlRTDQpSTEVfY291bnRzX2ZvcmdncGxvdCA8LSBzd2VlcChsb2cyKGNvdW50cyswLjI1KSwgTUFSR0lOPTEsIFNUQVRTPSByb3dNZWFucyhsb2cyKGNvdW50cyswLjI1KSkpDQpSTEVfY291bnRzX2ZvcmdncGxvdCRnZW5lcyA8LSByb3cubmFtZXMoUkxFX2NvdW50c19mb3JnZ3Bsb3QpDQpSTEVfY291bnRzX2ZvcmdncGxvdCAgPC0gUkxFX2NvdW50c19mb3JnZ3Bsb3QgICU+JSAgcGl2b3RfbG9uZ2VyKC1nZW5lcywgbmFtZXNfdG8gPSAiQ29uZGl0aW9uIiwgdmFsdWVzX3RvID0gImRldmlhdGlvbnMiKQ0KI2xvY2sgaW4gdGhlIG9yZGVyIG9mIHRoZSBzYW1wbGVzLCBvciB0aGV5IHdpbGwgYmUgcmVhcnJhbmdlZCBkdXJpbmcgcGxvdHRpbmcNClJMRV9jb3VudHNfZm9yZ2dwbG90JENvbmRpdGlvbiA8LSBmYWN0b3IoUkxFX2NvdW50c19mb3JnZ3Bsb3QkQ29uZGl0aW9uLCBsZXZlbHMgPSAgb3JkZXJlZF9sZXZlbHMpDQoNCnBsb3QxIDwtIGdncGxvdChSTEVfY291bnRzX2ZvcmdncGxvdCwgYWVzKHg9Q29uZGl0aW9uLCB5PWRldmlhdGlvbnMsIGZpbGw9Q29uZGl0aW9uKSkgKw0KICBnZW9tX3Zpb2xpbih0cmltPUZBTFNFKSsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPWNvbG9yX2xpc3QpKw0KICAjZ2VvbV9qaXR0ZXIoc2hhcGU9MTYsIHBvc2l0aW9uPXBvc2l0aW9uX2ppdHRlcigwLjIpLCBhbHBoYT0wLjAxKSArDQogICNnZW9tX2JveHBsb3Qod2lkdGg9MC4xLCBvdXRsaWVyLmNvbG9yID0gImJsYWNrIiwgb3V0bGllci5hbHBoYT0wLjAxKSsNCiAgc3RhdF9zdW1tYXJ5KGZ1bj1tZWRpYW4sIHBjaD0yMSwgc2l6ZT0wLjUsIGNvbG9yPSJibGFjayIsIGZpbGw9ImRvZGdlcmJsdWUiKSsNCiAgdGhlbWVfY2xhc3NpYygpKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb249Im5vbmUiLCBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCB2anVzdCA9IDAuNSwgaGp1c3Q9MSkpKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQ9MCwgbGluZXR5cGU9ImxvbmdkYXNoIiwgY29sb3IgPSAiZG9kZ2VyYmx1ZSIsIHNpemU9MC41KSsNCiAgeGxhYigiIikgKyANCiAgeWxhYigiUmVsYXRpdmUgbG9nMiBleHByZXNzaW9uIG9mIGVhY2ggZ2VuZSAoZXhwcmVzc2lvbi1tZWFuKSIpKw0KICBnZ3RpdGxlKCJSZWxhdGl2ZSBMZXZlbHMgb2YgRXhwcmVzc2lvbjogcmF3Y291bnRzIikrDQogIE5VTEwNCg0KIyMgQ1BNDQoNCnRtcCA8LWFzLmRhdGEuZnJhbWUoMl4oY291bnRzX0NQTWxvZzItMC4yNSkpDQpSTEVfbG9nQ1BNX2ZvcmdncGxvdCA8LSBzd2VlcChsb2cyKHRtcCksIE1BUkdJTj0xLCBTVEFUUz0gcm93TWVhbnMobG9nMih0bXApKSkgDQpSTEVfbG9nQ1BNX2ZvcmdncGxvdCRnZW5lcyA8LSByb3cubmFtZXMoYXMuZGF0YS5mcmFtZShSTEVfbG9nQ1BNX2ZvcmdncGxvdCkpDQpSTEVfbG9nQ1BNX2ZvcmdncGxvdCA8LSBSTEVfbG9nQ1BNX2ZvcmdncGxvdCAgJT4lICBwaXZvdF9sb25nZXIoLWdlbmVzLCBuYW1lc190byA9ICJDb25kaXRpb24iLCB2YWx1ZXNfdG8gPSAiZGV2aWF0aW9ucyIpDQojbG9jayBpbiB0aGUgb3JkZXIgb2YgdGhlIHNhbXBsZXMsIG9yIHRoZXkgd2lsbCBiZSByZWFycmFuZ2VkIGR1cmluZyBwbG90dGluZw0KUkxFX2xvZ0NQTV9mb3JnZ3Bsb3QkQ29uZGl0aW9uIDwtIGZhY3RvcihSTEVfbG9nQ1BNX2ZvcmdncGxvdCRDb25kaXRpb24sIGxldmVscyA9ICBvcmRlcmVkX2xldmVscykNCg0KcGxvdDIgPC0gZ2dwbG90KFJMRV9sb2dDUE1fZm9yZ2dwbG90LCBhZXMoeD1Db25kaXRpb24sIHk9ZGV2aWF0aW9ucywgZmlsbD1Db25kaXRpb24pKSArDQogIGdlb21fdmlvbGluKHRyaW09RkFMU0UpKw0KICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9Y29sb3JfbGlzdCkrDQogICNnZW9tX2ppdHRlcihzaGFwZT0xNiwgcG9zaXRpb249cG9zaXRpb25faml0dGVyKDAuMiksIGFscGhhPTAuMDEpICsNCiAgI2dlb21fYm94cGxvdCh3aWR0aD0wLjEsIG91dGxpZXIuY29sb3IgPSAiYmxhY2siLCBvdXRsaWVyLmFscGhhPTAuMDEpKw0KICBzdGF0X3N1bW1hcnkoZnVuPW1lZGlhbiwgcGNoPTIxLCBzaXplPTAuNSwgY29sb3I9ImJsYWNrIiwgZmlsbD0iZG9kZ2VyYmx1ZSIpKw0KICB0aGVtZV9jbGFzc2ljKCkrDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIHZqdXN0ID0gMC41LCBoanVzdD0xKSkrDQogIGdlb21faGxpbmUoeWludGVyY2VwdD0wLCBsaW5ldHlwZT0ibG9uZ2Rhc2giLCBjb2xvciA9ICJkb2RnZXJibHVlIiwgc2l6ZT0wLjUpKw0KICB5bGltKGMoLTEwLDEwKSkrDQogIHhsYWIoIiIpICsgDQogIHlsYWIoIlJlbGF0aXZlIGxvZzIgZXhwcmVzc2lvbiBvZiBlYWNoIGdlbmUgKGV4cHJlc3Npb24tbWVhbikiKSsNCiAgZ2d0aXRsZSgiUmVsYXRpdmUgTGV2ZWxzIG9mIEV4cHJlc3Npb246IGxvZ0NQTXMiKSsNCiAgTlVMTA0KDQojIyBGSUxURVJFRCBDUE0NCg0KdG1wIDwtYXMuZGF0YS5mcmFtZSgyXihjb3VudHNfQ1BNbG9nMl9maWx0ZXJlZC0wLjI1KSkNClJMRV9sb2dDUE1maWx0ZXJlZF9mb3JnZ3Bsb3QgPC0gc3dlZXAobG9nMih0bXApLCBNQVJHSU49MSwgU1RBVFM9IHJvd01lYW5zKGxvZzIodG1wKSkpIA0KUkxFX2xvZ0NQTWZpbHRlcmVkX2ZvcmdncGxvdCRnZW5lcyA8LSByb3cubmFtZXMoYXMuZGF0YS5mcmFtZShSTEVfbG9nQ1BNZmlsdGVyZWRfZm9yZ2dwbG90KSkNClJMRV9sb2dDUE1maWx0ZXJlZF9mb3JnZ3Bsb3QgPC0gUkxFX2xvZ0NQTWZpbHRlcmVkX2ZvcmdncGxvdCAgJT4lICBwaXZvdF9sb25nZXIoLWdlbmVzLCBuYW1lc190byA9ICJDb25kaXRpb24iLCB2YWx1ZXNfdG8gPSAiZGV2aWF0aW9ucyIpDQojbG9jayBpbiB0aGUgb3JkZXIgb2YgdGhlIHNhbXBsZXMsIG9yIHRoZXkgd2lsbCBiZSByZWFycmFuZ2VkIGR1cmluZyBwbG90dGluZw0KUkxFX2xvZ0NQTWZpbHRlcmVkX2ZvcmdncGxvdCRDb25kaXRpb24gPC0gZmFjdG9yKFJMRV9sb2dDUE1maWx0ZXJlZF9mb3JnZ3Bsb3QkQ29uZGl0aW9uLCBsZXZlbHMgPSBvcmRlcmVkX2xldmVscykNCg0KcGxvdDMgPC0gZ2dwbG90KFJMRV9sb2dDUE1maWx0ZXJlZF9mb3JnZ3Bsb3QsIGFlcyh4PUNvbmRpdGlvbiwgeT1kZXZpYXRpb25zLCBmaWxsPUNvbmRpdGlvbikpICsNCiAgZ2VvbV92aW9saW4odHJpbT1GQUxTRSkrDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1jb2xvcl9saXN0KSsNCiAgI2dlb21faml0dGVyKHNoYXBlPTE2LCBwb3NpdGlvbj1wb3NpdGlvbl9qaXR0ZXIoMC4yKSwgYWxwaGE9MC4wMSkgKw0KICAjZ2VvbV9ib3hwbG90KHdpZHRoPTAuMSwgb3V0bGllci5jb2xvciA9ICJibGFjayIsIG91dGxpZXIuYWxwaGE9MC4wMSkrDQogIHN0YXRfc3VtbWFyeShmdW49bWVkaWFuLCBwY2g9MjEsIHNpemU9MC41LCBjb2xvcj0iYmxhY2siLCBmaWxsPSJkb2RnZXJibHVlIikrDQogIHRoZW1lX2NsYXNzaWMoKSsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJub25lIiwgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwgdmp1c3QgPSAwLjUsIGhqdXN0PTEpKSsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0PTAsIGxpbmV0eXBlPSJsb25nZGFzaCIsIGNvbG9yID0gImRvZGdlcmJsdWUiLCBzaXplPTAuNSkrDQogIHlsaW0oYygtMTAsMTApKSsNCiAgeGxhYigiIikgKyANCiAgeWxhYigiUmVsYXRpdmUgbG9nMiBleHByZXNzaW9uIG9mIGVhY2ggZ2VuZSAoZXhwcmVzc2lvbi1tZWFuKSIpKw0KICBnZ3RpdGxlKCJSZWxhdGl2ZSBMZXZlbHMgb2YgRXhwcmVzc2lvbjogZmlsdGVyZWQgbG9nQ1BNcyIpKw0KICBOVUxMDQoNCiMjIEZJTFRFUkVELCBUTU0gTk9STUFMSVNFRCwgQ1BNDQp0bXAgPC1hcy5kYXRhLmZyYW1lKDJeKGNvdW50c19DUE1sb2cyX2ZpbHRlcmVkbm9ybWVkLTAuMjUpKQ0KUkxFX2xvZ0NQTWZpbHRlcmVkbm9ybWVkX2ZvcmdncGxvdCA8LSBzd2VlcChsb2cyKHRtcCksIE1BUkdJTj0xLCBTVEFUUz0gcm93TWVhbnMobG9nMih0bXApKSkgDQpSTEVfbG9nQ1BNZmlsdGVyZWRub3JtZWRfZm9yZ2dwbG90JGdlbmVzIDwtIHJvdy5uYW1lcyhhcy5kYXRhLmZyYW1lKFJMRV9sb2dDUE1maWx0ZXJlZG5vcm1lZF9mb3JnZ3Bsb3QpKQ0KUkxFX2xvZ0NQTWZpbHRlcmVkbm9ybWVkX2ZvcmdncGxvdCA8LSBSTEVfbG9nQ1BNZmlsdGVyZWRub3JtZWRfZm9yZ2dwbG90ICAlPiUgIHBpdm90X2xvbmdlcigtZ2VuZXMsIG5hbWVzX3RvID0gIkNvbmRpdGlvbiIsIHZhbHVlc190byA9ICJkZXZpYXRpb25zIikNCiNsb2NrIGluIHRoZSBvcmRlciBvZiB0aGUgc2FtcGxlcywgb3IgdGhleSB3aWxsIGJlIHJlYXJyYW5nZWQgZHVyaW5nIHBsb3R0aW5nDQpSTEVfbG9nQ1BNZmlsdGVyZWRub3JtZWRfZm9yZ2dwbG90JENvbmRpdGlvbiA8LSBmYWN0b3IoUkxFX2xvZ0NQTWZpbHRlcmVkbm9ybWVkX2ZvcmdncGxvdCRDb25kaXRpb24sIGxldmVscyA9ICBvcmRlcmVkX2xldmVscykNCg0KcGxvdDQgPC0gZ2dwbG90KFJMRV9sb2dDUE1maWx0ZXJlZG5vcm1lZF9mb3JnZ3Bsb3QsIGFlcyh4PUNvbmRpdGlvbiwgeT1kZXZpYXRpb25zLCBmaWxsPUNvbmRpdGlvbikpICsNCiAgZ2VvbV92aW9saW4odHJpbT1GQUxTRSkrDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1jb2xvcl9saXN0KSsNCiAgI2dlb21faml0dGVyKHNoYXBlPTE2LCBwb3NpdGlvbj1wb3NpdGlvbl9qaXR0ZXIoMC4yKSwgYWxwaGE9MC4wMSkgKw0KICAjZ2VvbV9ib3hwbG90KHdpZHRoPTAuMSwgb3V0bGllci5jb2xvciA9ICJibGFjayIsIG91dGxpZXIuYWxwaGE9MC4wMSkrDQogIHN0YXRfc3VtbWFyeShmdW49bWVkaWFuLCBwY2g9MjEsIHNpemU9MC41LCBjb2xvcj0iYmxhY2siLCBmaWxsPSJkb2RnZXJibHVlIikrDQogIHRoZW1lX2NsYXNzaWMoKSsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJub25lIiwgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwgdmp1c3QgPSAwLjUsIGhqdXN0PTEpKSsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0PTAsIGxpbmV0eXBlPSJsb25nZGFzaCIsIGNvbG9yID0gImRvZGdlcmJsdWUiLCBzaXplPTAuNSkrDQogIHlsaW0oYygtMTAsMTApKSsNCiAgeGxhYigiIikgKyANCiAgeWxhYigiUmVsYXRpdmUgbG9nMiBleHByZXNzaW9uIG9mIGVhY2ggZ2VuZSAoZXhwcmVzc2lvbi1tZWFuKSIpKw0KICBnZ3RpdGxlKCJSZWxhdGl2ZSBMZXZlbHMgb2YgRXhwcmVzc2lvbjogZmlsdGVyZWQgbG9nQ1BNcywgVE1NLW5vcm1hbGlzZWQiKSsNCiAgTlVMTA0KDQojIyBERVNFUTIgb2JqZWN0IChub3JtYWxpc2VkIGZvciBib3RoIGxpYnJhcnkgc2l6ZSBhbmQgY29tcG9zaXRpb25hbCBiaWFzKQ0KdG1wIDwtYXMuZGF0YS5mcmFtZShjb3VudHNfRGVTZXEyKQ0KUkxFX2NvdW50c0RlU2VxMl9mb3JnZ3Bsb3QgPC0gc3dlZXAobG9nMih0bXArMC4yNSksIE1BUkdJTj0xLCBTVEFUUz0gcm93TWVhbnMobG9nMih0bXArMC4yNSkpKQ0KUkxFX2NvdW50c0RlU2VxMl9mb3JnZ3Bsb3QkZ2VuZXMgPC0gcm93Lm5hbWVzKFJMRV9jb3VudHNEZVNlcTJfZm9yZ2dwbG90KQ0KUkxFX2NvdW50c0RlU2VxMl9mb3JnZ3Bsb3QgIDwtIFJMRV9jb3VudHNEZVNlcTJfZm9yZ2dwbG90ICAlPiUgIHBpdm90X2xvbmdlcigtZ2VuZXMsIG5hbWVzX3RvID0gIkNvbmRpdGlvbiIsIHZhbHVlc190byA9ICJkZXZpYXRpb25zIikNCiNsb2NrIGluIHRoZSBvcmRlciBvZiB0aGUgc2FtcGxlcywgb3IgdGhleSB3aWxsIGJlIHJlYXJyYW5nZWQgZHVyaW5nIHBsb3R0aW5nDQpSTEVfY291bnRzRGVTZXEyX2ZvcmdncGxvdCRDb25kaXRpb24gPC0gZmFjdG9yKFJMRV9jb3VudHNEZVNlcTJfZm9yZ2dwbG90JENvbmRpdGlvbiwgbGV2ZWxzID0gIG9yZGVyZWRfbGV2ZWxzKQ0KDQpwbG90NSA8LSBnZ3Bsb3QoUkxFX2NvdW50c0RlU2VxMl9mb3JnZ3Bsb3QsIGFlcyh4PUNvbmRpdGlvbiwgeT1kZXZpYXRpb25zLCBmaWxsPUNvbmRpdGlvbikpICsNCiAgZ2VvbV92aW9saW4odHJpbT1GQUxTRSkrDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1jb2xvcl9saXN0KSsNCiAgI2dlb21faml0dGVyKHNoYXBlPTE2LCBwb3NpdGlvbj1wb3NpdGlvbl9qaXR0ZXIoMC4yKSwgYWxwaGE9MC4wMSkgKw0KICAjZ2VvbV9ib3hwbG90KHdpZHRoPTAuMSwgb3V0bGllci5jb2xvciA9ICJibGFjayIsIG91dGxpZXIuYWxwaGE9MC4wMSkrDQogIHN0YXRfc3VtbWFyeShmdW49bWVkaWFuLCBwY2g9MjEsIHNpemU9MC41LCBjb2xvcj0iYmxhY2siLCBmaWxsPSJkb2RnZXJibHVlIikrDQogIHRoZW1lX2NsYXNzaWMoKSsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJub25lIiwgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwgdmp1c3QgPSAwLjUsIGhqdXN0PTEpKSsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0PTAsIGxpbmV0eXBlPSJsb25nZGFzaCIsIGNvbG9yID0gImRvZGdlcmJsdWUiLCBzaXplPTAuNSkrDQogIHlsaW0oYygtMTAsMTApKSsNCiAgeGxhYigiIikgKyANCiAgeWxhYigiUmVsYXRpdmUgbG9nMiBleHByZXNzaW9uIG9mIGVhY2ggZ2VuZSAoZXhwcmVzc2lvbi1tZWFuKSIpKw0KICBnZ3RpdGxlKCJSZWxhdGl2ZSBMZXZlbHMgb2YgRXhwcmVzc2lvbjogRGVTZXEyIikrDQogIE5VTEwNCg0KZ3JpZC5hcnJhbmdlKHBsb3QxLCBwbG90MiwgcGxvdDMsIHBsb3Q0LCBwbG90NSwgbmNvbD01LCBucm93PTEpDQoNCiNyZW1vdmUgdW51c2VkIHZhcmlhYmxlcw0Kcm0odG1wLCBSTEVfY291bnRzX2ZvcmdncGxvdCwgUkxFX2xvZ0NQTV9mb3JnZ3Bsb3QsIFJMRV9sb2dDUE1maWx0ZXJlZF9mb3JnZ3Bsb3QsIFJMRV9sb2dDUE1maWx0ZXJlZG5vcm1lZF9mb3JnZ3Bsb3QsIFJMRV9jb3VudHNEZVNlcTJfZm9yZ2dwbG90LCBwbG90MSwgcGxvdDIsIHBsb3QzLCBwbG90NCwgcGxvdDUpDQpgYGANCg0KDQojIyMjIyBfX1ZTVF9fDQpGb3IgdGhlIHB1cnBvc2Ugb2YgZXhwbG9yYXRvcnkgYW5hbHlzaXMgc3VjaCBhcyBNRFMsIFBDQSwgY2x1c3RlcmluZyBldGMsIFZTVCAodmFyaWFuY2Utc3RhYmlsaXppbmctdHJhbnNmb3JtYXRpb24pIGlzIHJlY29tbWVuZGVkLiBWU1QgaXMgYWxzbyBydW4gdXNpbmcgREVTZXEyLiBBcyBpbiB0aGUgcHJldmlvdXMgc3RlcCwgYSBERVNlcTIgb2JqZWN0IGlzIGNyZWF0ZWQuDQpWYXJpYW5jZSBzdGFiaWxpemluZyB0cmFuc2Zvcm1hdGlvbiAoVlNUKSBhaW1zIGF0IGdlbmVyYXRpbmcgYSBtYXRyaXggb2YgdmFsdWVzIGZvciB3aGljaCB2YXJpYW5jZSBpcyBjb25zdGFudCBhY3Jvc3MgdGhlIHJhbmdlIG9mIG1lYW4gdmFsdWVzLCBlc3BlY2lhbGx5IGZvciBsb3cgbWVhbi5UaGUgdnN0IGZ1bmN0aW9uIGNvbXB1dGVzIHRoZSBmaXR0ZWQgZGlzcGVyc2lvbi1tZWFuIHJlbGF0aW9uLCBkZXJpdmVzIHRoZSB0cmFuc2Zvcm1hdGlvbiB0byBhcHBseSBhbmQgYWNjb3VudHMgZm9yIGxpYnJhcnkgc2l6ZS4NCg0KRm9yIFJOQS1zZXEgZGF0YSwgYXMgdGhlIG1lYW4gY291bnQgdmFsdWUgaW5jcmVhc2VzLCB0aGUgdmFyaWFuY2UgaW5jcmVhc2VzLiBUaGVyZSBpcyBhIHN0cm9uZyBhbG1vc3QgbGluZWFyIHJlbGF0aW9uc2hpcCBhcyBzZWVuIGluIHRoZSBmaWd1cmVzLiBUaGUgc3RhdGlzdGljYWwgbWV0aG9kcyBzdWNoIGFzIFBDQSBleHBlY3RzIHNpbWlsYXIgdmFyaWFuY2UgYWNyb3NzIHRoZSByYW5nZSBvZiBtZWFuIHZhbHVlcy4gSWYgbm90LCB0aGUgaGlnaGVyIHZhcmlhbmNlIGdlbmVzIHdpbGwgY29udHJpYnV0ZSBtb3JlIHRoYW4gdGhlIGxvd2VyIHZhcmlhbmNlIGdlbmVzLiBTdWNoIGRhdGEgaXMgc2FpZCB0byBiZSBoZXRlcm9zY2VkYXN0aWMgYW5kIG5lZWRzIHRvIGJlIGNvcnJlY3RlZC4gQ29ycmVjdGlvbiB1c2luZyBsb2cgdHJhbnNmb3JtYXRpb24gKHdpdGggcHNldWRvY291bnQpIGdpdmVzIGluZmxhdGVzIHRoZSBjb250cmlidXRpb24gb2YgdGhlIGxvdyB2YXJpYW5jZSBnZW5lcy4gVG8gb2J0YWluIHNpbWlsYXIgdmFyaWFuY2UgYWNyb3NzIHRoZSB3aG9sZSByYW5nZSBvZiBtZWFuIHZhbHVlcywgREVTZXEyIG9mZmVycyB0d28gbWV0aG9kcyBWU1QgKHZhcmlhbmNlIHN0YWJpbGlzaW5nIHRyYW5zZm9ybWF0aW9uKSBhbmQgUkxPRyAocmVndWxhcmlzZWQgbG9nIHRyYW5zZm9ybWF0aW9uKS4NCg0KQXMgdGhlIG5hbWUgc3VnZ2VzdHMsIFZTVCB0cmFuc2Zvcm1hdGlvbiBzdGFiaWxpemVzIHZhcmlhbmNlIGFjcm9zcyB0aGUgd2hvbGUgcmFuZ2Ugb2YgY291bnQgdmFsdWVzLiBWU1QgaXMgcmVjb21tZW5kZWQgZm9yIGNsdXN0ZXJpbmcgb3IgdmlzdWFsaXNhdGlvbi4gSXQgaXMgbm90IGludGVuZGVkIGZvciBkaWZmZXJlbnRpYWwgZ2VuZSBleHByZXNzaW9uLiBJZiB0aGUgc2l6ZSBmYWN0b3JzIHZhcnkgZHJhbWF0aWNhbGx5IGJldHdlZW4gc2FtcGxlcywgdGhlbiBSTE9HIHRyYW5zZm9ybWF0aW9uIGlzIHJlY29tbWVuZGVkLg0KDQo8YnIvPg0KX19CZWxvdywgYW4gb3ZlcnZpZXcgb2YgdGhlIG1haW4gZGF0YXNldCBwcm9wZXJ0aWVzIGFjcm9zcyBvYmplY3RzX18NCjxici8+DQpgYGB7ciwgZmlnLndpZHRoPTMwLCBmaWcuaGVpZ2h0PTYsIGVjaG89RkFMU0V9DQojIGNhbGN1bGF0ZSBmaXR0ZWQgZGlzcGVyc2lvbi1tZWFuIHJlbGF0aW9uIGFuZCB1cGRhdGUgb3VyIERlc2VxMiBvYmplY3QNCkRlU2VxMl9vYmplY3QgPC0gREVTZXEyOjplc3RpbWF0ZURpc3BlcnNpb25zKERlU2VxMl9vYmplY3QpDQojIGFwcGx5IHRoZSB0cmFuc2Zvcm1hdGlvbiB0byB5b3VyIGNvdW50cw0KY291bnRzX1ZTVCA8LSBhcy5kYXRhLmZyYW1lKGFzc2F5KHZhcmlhbmNlU3RhYmlsaXppbmdUcmFuc2Zvcm1hdGlvbihEZVNlcTJfb2JqZWN0LGJsaW5kPVQpKSxjaGVjay5uYW1lcz1GKQ0KDQoNCiMjIyMjIyMgcGxvdHRpbmcNCiNzZXQgc3BhY2UgZm9yIDYgcGxvdHMNCnBhcihtZnJvdz1jKDEsNikpDQoNCiMgSnVzdCBmb3IgcmVmZXJlbmNlLCBwbG90IHRoZSBkaXN0cmlidXRpb24gb2YgcHJldmlvdXMgcmF3IGRhdGEgY291bnRzIChoZXJlIG9uIGxvZyBzY2FsZSkNCmJveHBsb3QobG9nMihhcy5tYXRyaXgoREdFX29iamVjdCkrMC4yNSksICN0aGlzIHdpbGwgdXNlIHRoZSAiY291bnRzIiBzbG90ID0gZG9pbmcgaXQgb24gImNvdW50cyINCiAgICAgICAgeGxhYj0iIiwgDQogICAgICAgIHlsYWI9IkxvZzEwIGNvdW50cyAocmF3IGRhdGEgKyAwLjI1KSIsDQogICAgICAgIHlsaW09YygwLDIwKSwNCiAgICAgICAgbGFzPTIsDQogICAgICAgIGNvbCA9IGNvbG9yX2xpc3QsDQogICAgICAgIGJvcmRlciA9ICJncmF5IikNCiMgTGV0J3MgYWRkIGEgYmx1ZSBob3Jpem9udGFsIGxpbmUgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgbWVkaWFuIHZhbHVlDQphYmxpbmUoaD1sb2cyKG1lZGlhbihER0Vfb2JqZWN0JGNvdW50cykrMC4yNSksY29sPSJibHVlIikNCnRpdGxlKCJCb3hwbG90cyBvZiBsb2djb3VudHMgKHJhdyBkYXRhLCB1bm5vcm1hbGlzZWQpIikNCg0KDQojIFBsb3QgdGhlIGRpc3RyaWJ1dGlvbnMgb2YgdGhlIHVuZmlsdGVyZWQgKGxvZzIpIGNvdW50cyBwZXIgbWlsbGlvbg0KYm94cGxvdChjb3VudHNfQ1BNbG9nMiwgICAgICAgICAgICAgICAgICAgICAgICAjZnVuY3Rpb24gY3BtKCkgYWRkcyBhbHJlYWR5IGEgc21hbGwgdmFsdWUgdG8gYXZvaWQgbG9nKDApDQogICAgICAgIHhsYWI9IiIsIA0KICAgICAgICB5bGFiPSJMb2cyIChjb3VudHMgcGVyIG1pbGxpb24gKyAwLjI1KSIsDQogICAgICAgIHlsaW09YygtNSwyMCksDQogICAgICAgIGxhcz0yLA0KICAgICAgICBjb2wgPSBjb2xvcl9saXN0LA0KICAgICAgICBib3JkZXIgPSAiZ3JheSIpDQojIExldCdzIGFkZCBhIGJsdWUgaG9yaXpvbnRhbCBsaW5lIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIG1lZGlhbiBsb2dDUE0NCmFibGluZShoPW1lZGlhbihjb3VudHNfQ1BNbG9nMiksY29sPSJibHVlIikNCnRpdGxlKCJCb3hwbG90cyBvZiBsb2dDUE1zICh1bm5vcm1hbGlzZWQpIikNCg0KDQojIFBsb3QgdGhlIGRpc3RyaWJ1dGlvbnMgb2YgdGhlIGZpbHRlcmVkIChsb2cyKSBjb3VudHMgcGVyIG1pbGxpb24NCmJveHBsb3QoY291bnRzX0NQTWxvZzJfZmlsdGVyZWQsICAgICAgICAgICAgICAgICAjZnVuY3Rpb24gY3BtKCkgYWRkcyBhbHJlYWR5IGEgc21hbGwgdmFsdWUgdG8gYXZvaWQgbG9nKDApDQogICAgICAgIHhsYWI9IiIsIA0KICAgICAgICB5bGFiPSJMb2cyIChjb3VudHMgcGVyIG1pbGxpb24gKyAwLjI1KSIsDQogICAgICAgIHlsaW09YygtNSwyMCksDQogICAgICAgIGxhcz0yLA0KICAgICAgICBjb2wgPSBjb2xvcl9saXN0LA0KICAgICAgICBib3JkZXIgPSAiZ3JheSIpDQojIExldCdzIGFkZCBhIGJsdWUgaG9yaXpvbnRhbCBsaW5lIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIG1lZGlhbiBsb2dDUE0NCmFibGluZShoPW1lZGlhbihjb3VudHNfQ1BNbG9nMl9maWx0ZXJlZCksY29sPSJibHVlIikNCnRpdGxlKCJCb3hwbG90cyBvZiBGSUxURVJFRCBsb2dDUE1zICh1bm5vcm1hbGlzZWQpIikNCg0KIyBQbG90IHRoZSBkaXN0cmlidXRpb25zIG9mIHRoZSBmaWx0ZXJlZCwgTk9STUFMSVNFRCAobG9nMikgY291bnRzIHBlciBtaWxsaW9uDQpib3hwbG90KGNvdW50c19DUE1sb2cyX2ZpbHRlcmVkbm9ybWVkLCAgICAgICAgICAgICAgICAgI2Z1bmN0aW9uIGNwbSgpIGFkZHMgYWxyZWFkeSBhIHNtYWxsIHZhbHVlIHRvIGF2b2lkIGxvZygwKQ0KICAgICAgICB4bGFiPSIiLCANCiAgICAgICAgeWxhYj0iTG9nMiAoY291bnRzIHBlciBtaWxsaW9uICsgMC4yNSkiLA0KICAgICAgICB5bGltPWMoLTUsMjApLA0KICAgICAgICBsYXM9MiwNCiAgICAgICAgY29sID0gY29sb3JfbGlzdCwNCiAgICAgICAgYm9yZGVyID0gImdyYXkiKQ0KIyBMZXQncyBhZGQgYSBibHVlIGhvcml6b250YWwgbGluZSB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBtZWRpYW4gbG9nQ1BNDQphYmxpbmUoaD1tZWRpYW4oY291bnRzX0NQTWxvZzJfZmlsdGVyZWRub3JtZWQpLGNvbD0iYmx1ZSIpDQp0aXRsZSgiQm94cGxvdHMgb2YgZmlsdGVyZWQgbG9nQ1BNcyAobm9ybWFsaXNlZCkiKQ0KDQojIFBsb3QgdGhlIGRpc3RyaWJ1dGlvbnMgb2YgdGhlIGZpbHRlcmVkLCBEZVNlcTIgbm9ybWFsaXNlZCBjb3VudHMNCmJveHBsb3QobG9nMihhcy5tYXRyaXgoY291bnRzX0RlU2VxMikrMC4yNSksIA0KICAgICAgICB4bGFiPSIiLCANCiAgICAgICAgeWxhYj0iTG9nMiAobm9ybWFsaXNlZCBjb3VudHMgKyAwLjI1KSIsDQogICAgICAgIGxhcz0yLA0KICAgICAgICBjb2wgPSBjb2xvcl9saXN0LA0KICAgICAgICBib3JkZXIgPSAiZ3JheSIpDQojIExldCdzIGFkZCBhIGJsdWUgaG9yaXpvbnRhbCBsaW5lIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIG1lZGlhbiBsb2dDUE0NCmFibGluZShoPWxvZzIobWVkaWFuKGFzLm1hdHJpeChjb3VudHNfRGVTZXEyKSkrMC4yNSksY29sPSJibHVlIikNCnRpdGxlKCJCb3hwbG90cyBvZiBEZVNlcTIgY291bnRzIChmaWx0ZXJlZCkiKQ0KDQojIFBsb3QgdGhlIGRpc3RyaWJ1dGlvbnMgb2YgdGhlIGZpbHRlcmVkLCBWU1Qgbm9ybWFsaXNlZCBjb3VudHMNCmJveHBsb3QoYXMubWF0cml4KGNvdW50c19WU1QpLCANCiAgICAgICAgeGxhYj0iIiwgDQogICAgICAgIHlsYWI9ImxvZzIgKHZzdC10cmFuc2Zvcm1lZCBjb3VudHMpIiwNCiAgICAgICAgeWxpbT1jKDAsMjApLA0KICAgICAgICBsYXM9MiwNCiAgICAgICAgY29sID0gY29sb3JfbGlzdCwNCiAgICAgICAgYm9yZGVyID0gImdyYXkiKQ0KIyBMZXQncyBhZGQgYSBibHVlIGhvcml6b250YWwgbGluZSB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBtZWRpYW4gbG9nQ1BNDQphYmxpbmUoaD1tZWRpYW4oYXMubWF0cml4KGNvdW50c19WU1QpKSxjb2w9ImJsdWUiKQ0KdGl0bGUoIkJveHBsb3RzIG9mIFZTVCBjb3VudHMgKGZpbHRlcmVkKSIpDQpgYGANCg0KYGBge3IsIGZpZy53aWR0aD0zMCwgZmlnLmhlaWdodD01LCB3YXJuaW5nPUZBTFNFLCBlY2hvPUZBTFNFfQ0KIyMgUGxvdCBSTEUgKHJlbGF0aXZlIGV4cHJlc3Npb24gbGV2ZWwpIHRvIGNoZWNrIGVmZmVjdGl2ZW5lc3Mgb2Ygbm9ybWFsaXNhdGlvbg0KIyBhIFJMRSBwbG90IGlzLCBvbiBsb2cgY291bnRzLCB0aGUgZGV2aWF0aW9uIG9mIGVhY2ggZ2VuZSByZWNvcmRpbmcsIHRvIGl0cyBhdmVyYWdlIGFjcm9zcyBhbGwgc2FtcGxlcw0KDQojIyBSQVcgQ09VTlRTDQpSTEVfY291bnRzX2ZvcmdncGxvdCA8LSBzd2VlcChsb2cyKGNvdW50cyswLjI1KSwgTUFSR0lOPTEsIFNUQVRTPSByb3dNZWFucyhsb2cyKGNvdW50cyswLjI1KSkpDQpSTEVfY291bnRzX2ZvcmdncGxvdCRnZW5lcyA8LSByb3cubmFtZXMoUkxFX2NvdW50c19mb3JnZ3Bsb3QpDQpSTEVfY291bnRzX2ZvcmdncGxvdCAgPC0gUkxFX2NvdW50c19mb3JnZ3Bsb3QgICU+JSAgcGl2b3RfbG9uZ2VyKC1nZW5lcywgbmFtZXNfdG8gPSAiQ29uZGl0aW9uIiwgdmFsdWVzX3RvID0gImRldmlhdGlvbnMiKQ0KI2xvY2sgaW4gdGhlIG9yZGVyIG9mIHRoZSBzYW1wbGVzLCBvciB0aGV5IHdpbGwgYmUgcmVhcnJhbmdlZCBkdXJpbmcgcGxvdHRpbmcNClJMRV9jb3VudHNfZm9yZ2dwbG90JENvbmRpdGlvbiA8LSBmYWN0b3IoUkxFX2NvdW50c19mb3JnZ3Bsb3QkQ29uZGl0aW9uLCBsZXZlbHMgPSAgb3JkZXJlZF9sZXZlbHMpDQoNCnBsb3QxIDwtIGdncGxvdChSTEVfY291bnRzX2ZvcmdncGxvdCwgYWVzKHg9Q29uZGl0aW9uLCB5PWRldmlhdGlvbnMsIGZpbGw9Q29uZGl0aW9uKSkgKw0KICBnZW9tX3Zpb2xpbih0cmltPUZBTFNFKSsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPWNvbG9yX2xpc3QpKw0KICAjZ2VvbV9qaXR0ZXIoc2hhcGU9MTYsIHBvc2l0aW9uPXBvc2l0aW9uX2ppdHRlcigwLjIpLCBhbHBoYT0wLjAxKSArDQogICNnZW9tX2JveHBsb3Qod2lkdGg9MC4xLCBvdXRsaWVyLmNvbG9yID0gImJsYWNrIiwgb3V0bGllci5hbHBoYT0wLjAxKSsNCiAgc3RhdF9zdW1tYXJ5KGZ1bj1tZWRpYW4sIHBjaD0yMSwgc2l6ZT0wLjUsIGNvbG9yPSJibGFjayIsIGZpbGw9ImRvZGdlcmJsdWUiKSsNCiAgdGhlbWVfY2xhc3NpYygpKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb249Im5vbmUiLCBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCB2anVzdCA9IDAuNSwgaGp1c3Q9MSkpKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQ9MCwgbGluZXR5cGU9ImxvbmdkYXNoIiwgY29sb3IgPSAiZG9kZ2VyYmx1ZSIsIHNpemU9MC41KSsNCiAgeGxhYigiIikgKyANCiAgeWxhYigiUmVsYXRpdmUgbG9nMiBleHByZXNzaW9uIG9mIGVhY2ggZ2VuZSAoZXhwcmVzc2lvbi1tZWFuKSIpKw0KICBnZ3RpdGxlKCJSZWxhdGl2ZSBMZXZlbHMgb2YgRXhwcmVzc2lvbjogcmF3Y291bnRzIikrDQogIE5VTEwNCg0KIyMgQ1BNDQoNCnRtcCA8LWFzLmRhdGEuZnJhbWUoMl4oY291bnRzX0NQTWxvZzItMC4yNSkpDQpSTEVfbG9nQ1BNX2ZvcmdncGxvdCA8LSBzd2VlcChsb2cyKHRtcCksIE1BUkdJTj0xLCBTVEFUUz0gcm93TWVhbnMobG9nMih0bXApKSkgDQpSTEVfbG9nQ1BNX2ZvcmdncGxvdCRnZW5lcyA8LSByb3cubmFtZXMoYXMuZGF0YS5mcmFtZShSTEVfbG9nQ1BNX2ZvcmdncGxvdCkpDQpSTEVfbG9nQ1BNX2ZvcmdncGxvdCA8LSBSTEVfbG9nQ1BNX2ZvcmdncGxvdCAgJT4lICBwaXZvdF9sb25nZXIoLWdlbmVzLCBuYW1lc190byA9ICJDb25kaXRpb24iLCB2YWx1ZXNfdG8gPSAiZGV2aWF0aW9ucyIpDQojbG9jayBpbiB0aGUgb3JkZXIgb2YgdGhlIHNhbXBsZXMsIG9yIHRoZXkgd2lsbCBiZSByZWFycmFuZ2VkIGR1cmluZyBwbG90dGluZw0KUkxFX2xvZ0NQTV9mb3JnZ3Bsb3QkQ29uZGl0aW9uIDwtIGZhY3RvcihSTEVfbG9nQ1BNX2ZvcmdncGxvdCRDb25kaXRpb24sIGxldmVscyA9ICBvcmRlcmVkX2xldmVscykNCg0KcGxvdDIgPC0gZ2dwbG90KFJMRV9sb2dDUE1fZm9yZ2dwbG90LCBhZXMoeD1Db25kaXRpb24sIHk9ZGV2aWF0aW9ucywgZmlsbD1Db25kaXRpb24pKSArDQogIGdlb21fdmlvbGluKHRyaW09RkFMU0UpKw0KICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9Y29sb3JfbGlzdCkrDQogICNnZW9tX2ppdHRlcihzaGFwZT0xNiwgcG9zaXRpb249cG9zaXRpb25faml0dGVyKDAuMiksIGFscGhhPTAuMDEpICsNCiAgI2dlb21fYm94cGxvdCh3aWR0aD0wLjEsIG91dGxpZXIuY29sb3IgPSAiYmxhY2siLCBvdXRsaWVyLmFscGhhPTAuMDEpKw0KICBzdGF0X3N1bW1hcnkoZnVuPW1lZGlhbiwgcGNoPTIxLCBzaXplPTAuNSwgY29sb3I9ImJsYWNrIiwgZmlsbD0iZG9kZ2VyYmx1ZSIpKw0KICB0aGVtZV9jbGFzc2ljKCkrDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIHZqdXN0ID0gMC41LCBoanVzdD0xKSkrDQogIGdlb21faGxpbmUoeWludGVyY2VwdD0wLCBsaW5ldHlwZT0ibG9uZ2Rhc2giLCBjb2xvciA9ICJkb2RnZXJibHVlIiwgc2l6ZT0wLjUpKw0KICB5bGltKGMoLTEwLDEwKSkrDQogIHhsYWIoIiIpICsgDQogIHlsYWIoIlJlbGF0aXZlIGxvZzIgZXhwcmVzc2lvbiBvZiBlYWNoIGdlbmUgKGV4cHJlc3Npb24tbWVhbikiKSsNCiAgZ2d0aXRsZSgiUmVsYXRpdmUgTGV2ZWxzIG9mIEV4cHJlc3Npb246IGxvZ0NQTXMiKSsNCiAgTlVMTA0KDQojIyBGSUxURVJFRCBDUE0NCg0KdG1wIDwtYXMuZGF0YS5mcmFtZSgyXihjb3VudHNfQ1BNbG9nMl9maWx0ZXJlZC0wLjI1KSkNClJMRV9sb2dDUE1maWx0ZXJlZF9mb3JnZ3Bsb3QgPC0gc3dlZXAobG9nMih0bXApLCBNQVJHSU49MSwgU1RBVFM9IHJvd01lYW5zKGxvZzIodG1wKSkpIA0KUkxFX2xvZ0NQTWZpbHRlcmVkX2ZvcmdncGxvdCRnZW5lcyA8LSByb3cubmFtZXMoYXMuZGF0YS5mcmFtZShSTEVfbG9nQ1BNZmlsdGVyZWRfZm9yZ2dwbG90KSkNClJMRV9sb2dDUE1maWx0ZXJlZF9mb3JnZ3Bsb3QgPC0gUkxFX2xvZ0NQTWZpbHRlcmVkX2ZvcmdncGxvdCAgJT4lICBwaXZvdF9sb25nZXIoLWdlbmVzLCBuYW1lc190byA9ICJDb25kaXRpb24iLCB2YWx1ZXNfdG8gPSAiZGV2aWF0aW9ucyIpDQojbG9jayBpbiB0aGUgb3JkZXIgb2YgdGhlIHNhbXBsZXMsIG9yIHRoZXkgd2lsbCBiZSByZWFycmFuZ2VkIGR1cmluZyBwbG90dGluZw0KUkxFX2xvZ0NQTWZpbHRlcmVkX2ZvcmdncGxvdCRDb25kaXRpb24gPC0gZmFjdG9yKFJMRV9sb2dDUE1maWx0ZXJlZF9mb3JnZ3Bsb3QkQ29uZGl0aW9uLCBsZXZlbHMgPSAgb3JkZXJlZF9sZXZlbHMpDQoNCnBsb3QzIDwtIGdncGxvdChSTEVfbG9nQ1BNZmlsdGVyZWRfZm9yZ2dwbG90LCBhZXMoeD1Db25kaXRpb24sIHk9ZGV2aWF0aW9ucywgZmlsbD1Db25kaXRpb24pKSArDQogIGdlb21fdmlvbGluKHRyaW09RkFMU0UpKw0KICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9Y29sb3JfbGlzdCkrDQogICNnZW9tX2ppdHRlcihzaGFwZT0xNiwgcG9zaXRpb249cG9zaXRpb25faml0dGVyKDAuMiksIGFscGhhPTAuMDEpICsNCiAgI2dlb21fYm94cGxvdCh3aWR0aD0wLjEsIG91dGxpZXIuY29sb3IgPSAiYmxhY2siLCBvdXRsaWVyLmFscGhhPTAuMDEpKw0KICBzdGF0X3N1bW1hcnkoZnVuPW1lZGlhbiwgcGNoPTIxLCBzaXplPTAuNSwgY29sb3I9ImJsYWNrIiwgZmlsbD0iZG9kZ2VyYmx1ZSIpKw0KICB0aGVtZV9jbGFzc2ljKCkrDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIHZqdXN0ID0gMC41LCBoanVzdD0xKSkrDQogIGdlb21faGxpbmUoeWludGVyY2VwdD0wLCBsaW5ldHlwZT0ibG9uZ2Rhc2giLCBjb2xvciA9ICJkb2RnZXJibHVlIiwgc2l6ZT0wLjUpKw0KICB5bGltKGMoLTEwLDEwKSkrDQogIHhsYWIoIiIpICsgDQogIHlsYWIoIlJlbGF0aXZlIGxvZzIgZXhwcmVzc2lvbiBvZiBlYWNoIGdlbmUgKGV4cHJlc3Npb24tbWVhbikiKSsNCiAgZ2d0aXRsZSgiUmVsYXRpdmUgTGV2ZWxzIG9mIEV4cHJlc3Npb246IGZpbHRlcmVkIGxvZ0NQTXMiKSsNCiAgTlVMTA0KDQojIyBGSUxURVJFRCwgVE1NIE5PUk1BTElTRUQsIENQTQ0KdG1wIDwtYXMuZGF0YS5mcmFtZSgyXihjb3VudHNfQ1BNbG9nMl9maWx0ZXJlZG5vcm1lZC0wLjI1KSkNClJMRV9sb2dDUE1maWx0ZXJlZG5vcm1lZF9mb3JnZ3Bsb3QgPC0gc3dlZXAobG9nMih0bXApLCBNQVJHSU49MSwgU1RBVFM9IHJvd01lYW5zKGxvZzIodG1wKSkpIA0KUkxFX2xvZ0NQTWZpbHRlcmVkbm9ybWVkX2ZvcmdncGxvdCRnZW5lcyA8LSByb3cubmFtZXMoYXMuZGF0YS5mcmFtZShSTEVfbG9nQ1BNZmlsdGVyZWRub3JtZWRfZm9yZ2dwbG90KSkNClJMRV9sb2dDUE1maWx0ZXJlZG5vcm1lZF9mb3JnZ3Bsb3QgPC0gUkxFX2xvZ0NQTWZpbHRlcmVkbm9ybWVkX2ZvcmdncGxvdCAgJT4lICBwaXZvdF9sb25nZXIoLWdlbmVzLCBuYW1lc190byA9ICJDb25kaXRpb24iLCB2YWx1ZXNfdG8gPSAiZGV2aWF0aW9ucyIpDQojbG9jayBpbiB0aGUgb3JkZXIgb2YgdGhlIHNhbXBsZXMsIG9yIHRoZXkgd2lsbCBiZSByZWFycmFuZ2VkIGR1cmluZyBwbG90dGluZw0KUkxFX2xvZ0NQTWZpbHRlcmVkbm9ybWVkX2ZvcmdncGxvdCRDb25kaXRpb24gPC0gZmFjdG9yKFJMRV9sb2dDUE1maWx0ZXJlZG5vcm1lZF9mb3JnZ3Bsb3QkQ29uZGl0aW9uLCBsZXZlbHMgPSAgb3JkZXJlZF9sZXZlbHMpDQoNCnBsb3Q0IDwtIGdncGxvdChSTEVfbG9nQ1BNZmlsdGVyZWRub3JtZWRfZm9yZ2dwbG90LCBhZXMoeD1Db25kaXRpb24sIHk9ZGV2aWF0aW9ucywgZmlsbD1Db25kaXRpb24pKSArDQogIGdlb21fdmlvbGluKHRyaW09RkFMU0UpKw0KICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9Y29sb3JfbGlzdCkrDQogICNnZW9tX2ppdHRlcihzaGFwZT0xNiwgcG9zaXRpb249cG9zaXRpb25faml0dGVyKDAuMiksIGFscGhhPTAuMDEpICsNCiAgI2dlb21fYm94cGxvdCh3aWR0aD0wLjEsIG91dGxpZXIuY29sb3IgPSAiYmxhY2siLCBvdXRsaWVyLmFscGhhPTAuMDEpKw0KICBzdGF0X3N1bW1hcnkoZnVuPW1lZGlhbiwgcGNoPTIxLCBzaXplPTAuNSwgY29sb3I9ImJsYWNrIiwgZmlsbD0iZG9kZ2VyYmx1ZSIpKw0KICB0aGVtZV9jbGFzc2ljKCkrDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIHZqdXN0ID0gMC41LCBoanVzdD0xKSkrDQogIGdlb21faGxpbmUoeWludGVyY2VwdD0wLCBsaW5ldHlwZT0ibG9uZ2Rhc2giLCBjb2xvciA9ICJkb2RnZXJibHVlIiwgc2l6ZT0wLjUpKw0KICB5bGltKGMoLTEwLDEwKSkrDQogIHhsYWIoIiIpICsgDQogIHlsYWIoIlJlbGF0aXZlIGxvZzIgZXhwcmVzc2lvbiBvZiBlYWNoIGdlbmUgKGV4cHJlc3Npb24tbWVhbikiKSsNCiAgZ2d0aXRsZSgiUmVsYXRpdmUgTGV2ZWxzIG9mIEV4cHJlc3Npb246IGZpbHRlcmVkIGxvZ0NQTXMsIFRNTS1ub3JtYWxpc2VkIikrDQogIE5VTEwNCg0KIyMgREVTRVEyIG9iamVjdCAobm9ybWFsaXNlZCBmb3IgYm90aCBsaWJyYXJ5IHNpemUgYW5kIGNvbXBvc2l0aW9uYWwgYmlhcykNCnRtcCA8LWFzLmRhdGEuZnJhbWUoY291bnRzX0RlU2VxMikNClJMRV9jb3VudHNEZVNlcTJfZm9yZ2dwbG90IDwtIHN3ZWVwKGxvZzIodG1wKzAuMjUpLCBNQVJHSU49MSwgU1RBVFM9IHJvd01lYW5zKGxvZzIodG1wKzAuMjUpKSkNClJMRV9jb3VudHNEZVNlcTJfZm9yZ2dwbG90JGdlbmVzIDwtIHJvdy5uYW1lcyhSTEVfY291bnRzRGVTZXEyX2ZvcmdncGxvdCkNClJMRV9jb3VudHNEZVNlcTJfZm9yZ2dwbG90ICA8LSBSTEVfY291bnRzRGVTZXEyX2ZvcmdncGxvdCAgJT4lICBwaXZvdF9sb25nZXIoLWdlbmVzLCBuYW1lc190byA9ICJDb25kaXRpb24iLCB2YWx1ZXNfdG8gPSAiZGV2aWF0aW9ucyIpDQojbG9jayBpbiB0aGUgb3JkZXIgb2YgdGhlIHNhbXBsZXMsIG9yIHRoZXkgd2lsbCBiZSByZWFycmFuZ2VkIGR1cmluZyBwbG90dGluZw0KUkxFX2NvdW50c0RlU2VxMl9mb3JnZ3Bsb3QkQ29uZGl0aW9uIDwtIGZhY3RvcihSTEVfY291bnRzRGVTZXEyX2ZvcmdncGxvdCRDb25kaXRpb24sIGxldmVscyA9ICBvcmRlcmVkX2xldmVscykNCg0KcGxvdDUgPC0gZ2dwbG90KFJMRV9jb3VudHNEZVNlcTJfZm9yZ2dwbG90LCBhZXMoeD1Db25kaXRpb24sIHk9ZGV2aWF0aW9ucywgZmlsbD1Db25kaXRpb24pKSArDQogIGdlb21fdmlvbGluKHRyaW09RkFMU0UpKw0KICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9Y29sb3JfbGlzdCkrDQogICNnZW9tX2ppdHRlcihzaGFwZT0xNiwgcG9zaXRpb249cG9zaXRpb25faml0dGVyKDAuMiksIGFscGhhPTAuMDEpICsNCiAgI2dlb21fYm94cGxvdCh3aWR0aD0wLjEsIG91dGxpZXIuY29sb3IgPSAiYmxhY2siLCBvdXRsaWVyLmFscGhhPTAuMDEpKw0KICBzdGF0X3N1bW1hcnkoZnVuPW1lZGlhbiwgcGNoPTIxLCBzaXplPTAuNSwgY29sb3I9ImJsYWNrIiwgZmlsbD0iZG9kZ2VyYmx1ZSIpKw0KICB0aGVtZV9jbGFzc2ljKCkrDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIHZqdXN0ID0gMC41LCBoanVzdD0xKSkrDQogIGdlb21faGxpbmUoeWludGVyY2VwdD0wLCBsaW5ldHlwZT0ibG9uZ2Rhc2giLCBjb2xvciA9ICJkb2RnZXJibHVlIiwgc2l6ZT0wLjUpKw0KICB5bGltKGMoLTEwLDEwKSkrDQogIHhsYWIoIiIpICsgDQogIHlsYWIoIlJlbGF0aXZlIGxvZzIgZXhwcmVzc2lvbiBvZiBlYWNoIGdlbmUgKGV4cHJlc3Npb24tbWVhbikiKSsNCiAgZ2d0aXRsZSgiUmVsYXRpdmUgTGV2ZWxzIG9mIEV4cHJlc3Npb246IERlU2VxMiIpKw0KICBOVUxMDQoNCiMjIERFU0VRMi1WU1Qgb2JqZWN0IChub3JtYWxpc2VkIGZvciBib3RoIGxpYnJhcnkgc2l6ZSBhbmQgY29tcG9zaXRpb25hbCBiaWFzLCBWU1QnZCkNCg0KUkxFX2NvdW50c1ZTVF9mb3JnZ3Bsb3QgPC0gc3dlZXAobG9nMihjb3VudHNfVlNUKzAuMjUpLCBNQVJHSU49MSwgU1RBVFM9IHJvd01lYW5zKGxvZzIoY291bnRzX1ZTVCswLjI1KSkpDQpSTEVfY291bnRzVlNUX2ZvcmdncGxvdCRnZW5lcyA8LSByb3cubmFtZXMoUkxFX2NvdW50c1ZTVF9mb3JnZ3Bsb3QpDQpSTEVfY291bnRzVlNUX2ZvcmdncGxvdCAgPC0gUkxFX2NvdW50c1ZTVF9mb3JnZ3Bsb3QgICU+JSAgcGl2b3RfbG9uZ2VyKC1nZW5lcywgbmFtZXNfdG8gPSAiQ29uZGl0aW9uIiwgdmFsdWVzX3RvID0gImRldmlhdGlvbnMiKQ0KI2xvY2sgaW4gdGhlIG9yZGVyIG9mIHRoZSBzYW1wbGVzLCBvciB0aGV5IHdpbGwgYmUgcmVhcnJhbmdlZCBkdXJpbmcgcGxvdHRpbmcNClJMRV9jb3VudHNWU1RfZm9yZ2dwbG90JENvbmRpdGlvbiA8LSBmYWN0b3IoUkxFX2NvdW50c1ZTVF9mb3JnZ3Bsb3QkQ29uZGl0aW9uLCBsZXZlbHMgPSAgb3JkZXJlZF9sZXZlbHMpDQoNCnBsb3Q2IDwtIGdncGxvdChSTEVfY291bnRzVlNUX2ZvcmdncGxvdCwgYWVzKHg9Q29uZGl0aW9uLCB5PWRldmlhdGlvbnMsIGZpbGw9Q29uZGl0aW9uKSkgKw0KICBnZW9tX3Zpb2xpbih0cmltPUZBTFNFKSsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPWNvbG9yX2xpc3QpKw0KICAjZ2VvbV9qaXR0ZXIoc2hhcGU9MTYsIHBvc2l0aW9uPXBvc2l0aW9uX2ppdHRlcigwLjIpLCBhbHBoYT0wLjAxKSArDQogICNnZW9tX2JveHBsb3Qod2lkdGg9MC4xLCBvdXRsaWVyLmNvbG9yID0gImJsYWNrIiwgb3V0bGllci5hbHBoYT0wLjAxKSsNCiAgc3RhdF9zdW1tYXJ5KGZ1bj1tZWRpYW4sIHBjaD0yMSwgc2l6ZT0wLjUsIGNvbG9yPSJibGFjayIsIGZpbGw9ImRvZGdlcmJsdWUiKSsNCiAgdGhlbWVfY2xhc3NpYygpKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb249Im5vbmUiLCBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCB2anVzdCA9IDAuNSwgaGp1c3Q9MSkpKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQ9MCwgbGluZXR5cGU9ImxvbmdkYXNoIiwgY29sb3IgPSAiZG9kZ2VyYmx1ZSIsIHNpemU9MC41KSsNCiAgeWxpbShjKC0xMCwxMCkpKw0KICB4bGFiKCIiKSArIA0KICB5bGFiKCJSZWxhdGl2ZSBsb2cyIGV4cHJlc3Npb24gb2YgZWFjaCBnZW5lIChleHByZXNzaW9uLW1lYW4pIikrDQogIGdndGl0bGUoIlJlbGF0aXZlIExldmVscyBvZiBFeHByZXNzaW9uOiBEZVNlcTItVlNUIikrDQogIE5VTEwNCg0KDQpncmlkLmFycmFuZ2UocGxvdDEsIHBsb3QyLCBwbG90MywgcGxvdDQsIHBsb3Q1LCBwbG90NiwgbmNvbD02LCBucm93PTEpDQoNCiNyZW1vdmUgdW51c2VkIHZhcmlhYmxlcw0Kcm0odG1wLCBSTEVfY291bnRzX2ZvcmdncGxvdCwgUkxFX2xvZ0NQTV9mb3JnZ3Bsb3QsIFJMRV9sb2dDUE1maWx0ZXJlZF9mb3JnZ3Bsb3QsIFJMRV9sb2dDUE1maWx0ZXJlZG5vcm1lZF9mb3JnZ3Bsb3QsIFJMRV9jb3VudHNEZVNlcTJfZm9yZ2dwbG90LCBSTEVfY291bnRzVlNUX2ZvcmdncGxvdCwgcGxvdDEsIHBsb3QyLCBwbG90MywgcGxvdDQsIHBsb3Q1LCBwbG90NikNCmBgYA0KDQpgYGB7ciwgZmlnLndpZHRoPTMwLCBmaWcuaGVpZ2h0PTUsIGVjaG89RkFMU0V9DQojaHR0cHM6Ly9uYmlzd2VkZW4uZ2l0aHViLmlvL3dvcmtzaG9wLVJOQXNlcS8xOTA2L2xhYl9kZ2UuaHRtbA0KIyBidXQgc2VlIGFsc28gaHR0cHM6Ly9iaW9jb25kdWN0b3Iub3JnL3BhY2thZ2VzL2RldmVsL2Jpb2MvdmlnbmV0dGVzL0RFU2VxMi9pbnN0L2RvYy9ERVNlcTIuaHRtbCNlZmZlY3RzLW9mLXRyYW5zZm9ybWF0aW9ucy1vbi10aGUtdmFyaWFuY2UNCiMgZGVmaW5lIGEgZnVuY3Rpb24gdGhhdCBjYWxjdWxhdGVzIHZhcmlhbmNlDQpyb3dWYXIgPC0gZnVuY3Rpb24oeCkgYXBwbHkoeCwxLHZhcikNCg0KIyMgTWVhbiB2cyBWYXJpYW5jZSBwbG90cyB0byBzZWUgZWZmZWN0IG9mIFZTVA0KIyBzZXQgc3BhY2UgZm9yIDggcGxvdHMNCnBhcihtZnJvdz1jKDEsNikpDQoNCnBsb3QobG9nMihyb3dNZWFucyhhcy5tYXRyaXgoREdFX29iamVjdCkpKSxsb2cyKHJvd1Zhcihhcy5tYXRyaXgoREdFX29iamVjdCkpKSwNCiAgICAgeGxhYj1leHByZXNzaW9uKCdMb2cnWzJdfidNZWFuIGNvdW50JyksDQogICAgIHlsYWI9ZXhwcmVzc2lvbignTG9nJ1syXX4nVmFyaWFuY2UnKSwNCiAgICAgY29sID0gYWxwaGEoImJsYWNrIiwgMC41KSwNCiAgICAgbWFpbj0iVW5maWx0ZXJlZCByYXcgZGF0YSAobm90IG5vcm1hbGlzZWQpIikNCg0KcGxvdChyb3dNZWFucyhjb3VudHNfQ1BNbG9nMikscm93VmFyKGNvdW50c19DUE1sb2cyKSwNCiAgICAgeGxhYj1leHByZXNzaW9uKCdMb2cnWzJdfidNZWFuIGNvdW50JyksDQogICAgIHlsYWI9ZXhwcmVzc2lvbignTG9nJ1syXX4nVmFyaWFuY2UnKSwNCiAgICAgY29sID0gYWxwaGEoImJsYWNrIiwgMC41KSwNCiAgICAgbWFpbj0iVW5maWx0ZXJlZCBsb2cyQ1BNIChub3Qgbm9ybWFsaXNlZCkiKQ0KDQpwbG90KHJvd01lYW5zKGNvdW50c19DUE1sb2cyX2ZpbHRlcmVkKSxyb3dWYXIoY291bnRzX0NQTWxvZzJfZmlsdGVyZWQpLA0KICAgICB4bGFiPWV4cHJlc3Npb24oJ0xvZydbMl1+J01lYW4gY291bnQnKSwNCiAgICAgeWxhYj1leHByZXNzaW9uKCdMb2cnWzJdfidWYXJpYW5jZScpLA0KICAgICBjb2wgPSBhbHBoYSgiYmxhY2siLCAwLjUpLA0KICAgICBtYWluPSJGSUxURVJFRCBsb2cyQ1BNIChub3Qgbm9ybWFsaXNlZCkiKQ0KDQpwbG90KHJvd01lYW5zKGNvdW50c19DUE1sb2cyX2ZpbHRlcmVkbm9ybWVkKSwgcm93VmFyKGNvdW50c19DUE1sb2cyX2ZpbHRlcmVkbm9ybWVkKSwNCiAgICAgeGxhYj1leHByZXNzaW9uKCdMb2cnWzJdfidNZWFuIGNvdW50JyksDQogICAgIHlsYWI9ZXhwcmVzc2lvbignTG9nJ1syXX4nVmFyaWFuY2UnKSwNCiAgICAgY29sID0gYWxwaGEoImJsYWNrIiwgMC41KSwNCiAgICAgbWFpbj0iRklMVEVSRUQgbG9nMkNQTSAobm9ybWFsaXNlZCkiKQ0KDQpwbG90KGxvZzIocm93TWVhbnMoY291bnRzX0RlU2VxMikpLGxvZzIocm93VmFyKGNvdW50c19EZVNlcTIpKSwNCiAgICAgeGxhYj1leHByZXNzaW9uKCdMb2cnWzJdfidNZWFuIGNvdW50JyksDQogICAgIHlsYWI9ZXhwcmVzc2lvbignTG9nJ1syXX4nVmFyaWFuY2UnKSwNCiAgICAgY29sID0gYWxwaGEoImJsYWNrIiwgMC41KSwNCiAgICAgbWFpbj0iREVTZXEyIikNCg0KcGxvdChyb3dNZWFucyhjb3VudHNfVlNUKSxyb3dWYXIoY291bnRzX1ZTVCksDQogICAgIHhsYWI9J01lYW4gY291bnQnLA0KICAgICB5bGFiPSdWYXJpYW5jZScsDQogICAgIGNvbCA9IGFscGhhKCJibGFjayIsIDAuNSksDQogICAgIG1haW49IlZTVCIpDQoNCiMjcmVtb3ZlIHVudXNlZCB2YXJpYWJsZXMgYW5kIGZ1bmN0aW9ucw0Kcm0ocm93VmFyKQ0KDQpgYGANCg0KYGBge3IsIGZpZy53aWR0aD0zMCwgZmlnLmhlaWdodD01LCBlY2hvPUZBTFNFfQ0KI3NldCBzcGFjZSBmb3Igc2l4IHBsb3RzDQpwYXIobWZyb3c9YygxLDYpKQ0KIA0KI3Bsb3QgdGhlIGNvdW50IGRpc3RyaWJ1dGlvbiB1bmRlciBhbGwgdHJhbnNmb3JtYXRpb25zDQoNCiMgR2V0IHNvbWUgbmljZSBjb2xvdXJzIGZvciBwbG90dGluZw0KIyBkZWZpbmUgYSBjb2xvdXIgcGFsZXR0ZQ0KbXlwYWxldHRlIDwtIGJyZXdlci5wYWwoOSwiQmx1ZXMiKSAjZnVuY3Rpb24uIOKAnFJkWWxCdeKAnSBpcyBhIGNvbW1vbiBjaG9pY2UsIGFuZCDigJxTcGVjdHJhbOKAnSBpcyBhbHNvIG5pY2UuDQojIGRlZmluZSBhIGN1c3RvbSBmdW5jdGlvbiAibW9yZWNvbHMiIHRoYXQgY29udmVydHMgYSBwYWxldHRlIGluIGEgY29udGludW91cyBzZXJpZXMNCm1vcmVjb2xzIDwtIGNvbG9yUmFtcFBhbGV0dGUobXlwYWxldHRlKQ0KDQoNCiMjIENoZWNrIGRpc3RyaWJ1dGlvbnMgb2YgbWVhc3VyZWQgZXhwcmVzc2lvbiB2YWx1ZXMgdXNpbmcgbGluZXBsb3RzDQoNCiNSQVcgQ09VTlRTDQpwbG90KGRlbnNpdHkobG9nMihjb3VudHNbLCAxXSswLjI1KSksIA0KICAgICBtYWluPSIiLA0KICAgICBjb2wgPSBjb2xvcl9saXN0WzFdLA0KICAgICB4bGFiPSJsb2cyKHJhd2NvdW50cyArIDAuMjUpIiwNCiAgICAgeWxhYj0iRGVuc2l0eSIsDQogICAgIHlsaW09cmFuZ2UocHJldHR5KGMoMCwgMC4yNSkpKSkNCg0KZm9yIChpIGluIDI6bmNvbChjb3VudHMpKSB7DQogIGxpbmVzKGRlbnNpdHkobG9nMihjb3VudHNbLCBpXSswLjI1KSksIA0KICAgICAgICBjb2w9IGNvbG9yX2xpc3RbaV0NCiAgICAgICAgKQ0KICB0aXRsZShtYWluID0gTlVMTCkNCn0NCiMgTGV0J3MgYWRkIGEgYmx1ZSB2ZXJ0aWNhbCBsaW5lIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIG1lZGlhbiBsb2dDUE0NCmFibGluZSh2PW1lZGlhbihsb2cyKGFzLm1hdHJpeChjb3VudHMpKzAuMjUpKSxjb2w9ImJsdWUiKQ0KdGl0bGUoIkRlbnNpdHkgZGlzdHJpYnV0aW9uIG9mIHJhdyBjb3VudHMiKQ0KDQoNCg0KI1VORklMVEVSRUQgbG9nMkNQTQ0KcGxvdChkZW5zaXR5KGNvdW50c19DUE1sb2cyWywgMV0pLCANCiAgICAgbWFpbj0iIiwNCiAgICAgY29sID0gY29sb3JfbGlzdFsxXSwNCiAgICAgeGxhYj0ibG9nMihDUE0gKyAwLjI1KSIsDQogICAgIHlsYWI9IkRlbnNpdHkiLA0KICAgICB5bGltPXJhbmdlKHByZXR0eShjKDAsIDAuMjUpKSkpDQoNCmZvciAoaSBpbiAyOm5jb2woY291bnRzX0NQTWxvZzIpKSB7DQogIGxpbmVzKGRlbnNpdHkoY291bnRzX0NQTWxvZzJbLCBpXSksIA0KICAgICAgICBjb2w9IGNvbG9yX2xpc3RbaV0NCiAgICAgICAgKQ0KICB0aXRsZShtYWluID0gTlVMTCkNCn0NCiMgTGV0J3MgYWRkIGEgYmx1ZSB2ZXJ0aWNhbCBsaW5lIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIG1lZGlhbiBsb2dDUE0NCmFibGluZSh2PW1lZGlhbihjb3VudHNfQ1BNbG9nMiksY29sPSJibHVlIikNCnRpdGxlKCJEZW5zaXR5IGRpc3RyaWJ1dGlvbiBvZiBsb2cyIENQTSBjb3VudHMiKQ0KDQojRklMVEVSRUQgbG9nMkNQTQ0KcGxvdChkZW5zaXR5KGNvdW50c19DUE1sb2cyX2ZpbHRlcmVkWywgMV0pLCANCiAgICAgbWFpbj0iIiwNCiAgICAgY29sID0gY29sb3JfbGlzdFsxXSwNCiAgICAgeGxhYj0ibG9nMihDUE0gKyAwLjI1KSIsDQogICAgIHlsYWI9IkRlbnNpdHkiLA0KICAgICB5bGltPXJhbmdlKHByZXR0eShjKDAsIDAuMjUpKSksDQogICAgIHhsaW09cmFuZ2UoLTUsMTUpDQogICAgICkNCg0KZm9yIChpIGluIDI6bmNvbChjb3VudHNfQ1BNbG9nMl9maWx0ZXJlZCkpIHsNCiAgbGluZXMoZGVuc2l0eShjb3VudHNfQ1BNbG9nMl9maWx0ZXJlZFssIGldKSwgDQogICAgICAgIGNvbD0gY29sb3JfbGlzdFtpXQ0KICAgICAgICApDQogIHRpdGxlKG1haW4gPSBOVUxMKQ0KfQ0KIyBMZXQncyBhZGQgYSBibHVlIHZlcnRpY2FsIGxpbmUgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgbWVkaWFuIGxvZ0NQTQ0KYWJsaW5lKHY9bWVkaWFuKGNvdW50c19DUE1sb2cyX2ZpbHRlcmVkKSxjb2w9ImJsdWUiKQ0KdGl0bGUoIkRlbnNpdHkgZGlzdHJpYnV0aW9uIG9mIEZJTFRFUkVEIGxvZzIgQ1BNIGNvdW50cyIpDQoNCiNGSUxURVJFRCBsb2cyQ1BNLCBOT1JNRUQNCnBsb3QoZGVuc2l0eShjb3VudHNfQ1BNbG9nMl9maWx0ZXJlZG5vcm1lZFssIDFdKSwgDQogICAgIG1haW49IiIsDQogICAgIGNvbCA9IGNvbG9yX2xpc3RbMV0sDQogICAgIHhsYWI9ImxvZzIoQ1BNICsgMC4yNSkiLA0KICAgICB5bGFiPSJEZW5zaXR5IiwNCiAgICAgeWxpbT1yYW5nZShwcmV0dHkoYygwLCAwLjI1KSkpLA0KICAgICB4bGltPXJhbmdlKC01LDE1KQ0KICAgICApDQoNCmZvciAoaSBpbiAyOm5jb2woY291bnRzX0NQTWxvZzJfZmlsdGVyZWRub3JtZWQpKSB7DQogIGxpbmVzKGRlbnNpdHkoY291bnRzX0NQTWxvZzJfZmlsdGVyZWRub3JtZWRbLCBpXSksIA0KICAgICAgICBjb2w9IGNvbG9yX2xpc3RbaV0NCiAgICAgICAgKQ0KICB0aXRsZShtYWluID0gTlVMTCkNCn0NCiMgTGV0J3MgYWRkIGEgYmx1ZSB2ZXJ0aWNhbCBsaW5lIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIG1lZGlhbiBsb2dDUE0NCmFibGluZSh2PW1lZGlhbihjb3VudHNfQ1BNbG9nMl9maWx0ZXJlZG5vcm1lZCksY29sPSJibHVlIikNCnRpdGxlKCJEZW5zaXR5IGRpc3RyaWJ1dGlvbiBvZiBmaWx0ZXJlZCwgbm9ybWVkIGxvZzIgQ1BNIGNvdW50cyIpDQoNCiNERVNFUTINCnBsb3QoZGVuc2l0eShsb2cyKGNvdW50c19EZVNlcTJbLCAxXSswLjI1KSksIA0KICAgICBtYWluPSIiLA0KICAgICBjb2wgPSBjb2xvcl9saXN0WzFdLA0KICAgICB4bGFiPSJsb2cyKENQTSArIDAuMjUpIiwNCiAgICAgeWxhYj0iRGVuc2l0eSIsDQogICAgIHlsaW09cmFuZ2UocHJldHR5KGMoMCwgMC4yNSkpKSwNCiAgICAgeGxpbT1yYW5nZSgtNSwxNSkNCiAgICAgKQ0KDQpmb3IgKGkgaW4gMjpuY29sKGNvdW50c19EZVNlcTIpKSB7DQogIGxpbmVzKGRlbnNpdHkobG9nMihjb3VudHNfRGVTZXEyWywgaV0rMC4yNSkpLCANCiAgICAgICAgY29sPSBjb2xvcl9saXN0W2ldDQogICAgICAgICkNCiAgdGl0bGUobWFpbiA9IE5VTEwpDQp9DQojIExldCdzIGFkZCBhIGJsdWUgdmVydGljYWwgbGluZSB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBtZWRpYW4gbG9nQ1BNDQphYmxpbmUodj1tZWRpYW4obG9nMihjb3VudHNfRGVTZXEyKzAuMjUpKSxjb2w9ImJsdWUiKQ0KdGl0bGUoIkRlbnNpdHkgZGlzdHJpYnV0aW9uIG9mIERlU2VxMi1ub3JtYWxpc2VkIGNvdW50cyIpDQoNCiNEZVNlcTItVlNUDQpwbG90KGRlbnNpdHkoY291bnRzX1ZTVFssIDFdKSwgDQogICAgIG1haW49IiIsDQogICAgIGNvbCA9IGNvbG9yX2xpc3RbMV0sDQogICAgIHhsYWI9In4gbG9nMihzY2FsZWQgY291bnRzKSIsDQogICAgIHlsYWI9IkRlbnNpdHkiLA0KICAgICB5bGltPXJhbmdlKHByZXR0eShjKDAsIDAuMjUpKSkpDQoNCmZvciAoaSBpbiAyOm5jb2woY291bnRzX1ZTVCkpIHsNCiAgbGluZXMoZGVuc2l0eShjb3VudHNfVlNUWywgaV0pLCANCiAgICAgICAgY29sPSBjb2xvcl9saXN0W2ldDQogICAgICAgICkNCiAgdGl0bGUobWFpbiA9IE5VTEwpDQp9DQojIExldCdzIGFkZCBhIGJsdWUgdmVydGljYWwgbGluZSB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBtZWRpYW4gbG9nQ1BNDQphYmxpbmUodj1tZWRpYW4oYXMubWF0cml4KGNvdW50c19WU1QpKSxjb2w9ImJsdWUiKQ0KdGl0bGUoIkRlbnNpdHkgZGlzdHJpYnV0aW9uIG9mIFZTVCBjb3VudHMiKQ0KDQoNCiNyZW1vdmUgdW51c2VkIHZhcmlhYmxlcw0Kcm0oaSwgbXlwYWxldHRlLCBtb3JlY29scykNCmBgYA0KDQpgYGB7ciwgZWNobz1GQUxTRX0NCiMjd2UgY2FuIG5vdyBzYXZlIHRoZSB0aHJlZSBtYWluIG9iamVjdHMgY3JlYXRlZCwgYW5kIGxvYWQgdGhlbSBpbiBlYWNoIHNlY3Rpb24gYXMgbmVlZGVkDQojb3JpZ2luYWwgY291bnRzLCBmaWx0ZXJlZCwgYW5kIHdpdGggVE1NIG5vcm1hbGlzYXRpb24gYXBwbGllZA0KI3NhdmUoREdFX29iamVjdF9maWx0ZXJlZG5vcm1lZCwgZmlsZSA9ICJEOi8vQW9jZWxsYXJpc19DUEZfTVBJX1QzL1NhdmVkX29iamVjdHMvREdFX29iamVjdF9maWx0ZXJlZG5vcm1lZC5yZHMiKQ0KDQojZmlsdGVyZWQgY291bnRzIGNvcnJlY3RlZCBmb3IgbGlicmFyeSBzaXplIHRocm91Z2ggQ1BNLCB2YWx1ZXMgYXJlIGxvZzIsIGFuZCB0aGV5IGFyZSBub3JtYWxpc2VkDQojc2F2ZShjb3VudHNfQ1BNbG9nMl9maWx0ZXJlZG5vcm1lZCwgZmlsZSA9ICJEOi8vQW9jZWxsYXJpc19DUEZfTVBJX1QzL1NhdmVkX29iamVjdHMvY291bnRzX0NQTWxvZzJfZmlsdGVyZWRub3JtZWQucmRzIikNCg0KI2NvdW50cyBub3JtYWxpc2VkIGZvZnIgbGlicmFyeSBzaXplIGFuZCBjb21wb3NpdGlvbmFsIGJpYXMgdGhyb3VnaCBEZVNlcTIgTWVkaWFuIG9mIFJhdGlvcywgd2l0aCBWU1QgYXBwbGllZA0KI3NhdmUoY291bnRzX1ZTVCwgZmlsZSA9ICJEOi8vQW9jZWxsYXJpc19DUEZfTVBJX1QzL1NhdmVkX29iamVjdHMvY291bnRzX1ZTVC5yZHMiKQ0KDQojc2F2ZSBzYW1wbGUgbWV0YWRhdGENCiNzYXZlKHNhbXBsZV9tZXRhZGF0YSwgZmlsZSA9ICJEOi8vQW9jZWxsYXJpc19DUEZfTVBJX1QzL1NhdmVkX29iamVjdHMvc2FtcGxlX21ldGFkYXRhLnJkcyIpDQoNCg0KI2NsZWFuIHVwIHRoZSB3b3Jrc3BhY2UNCnJtKGNvdW50cywgY291bnRzX0NQTWxvZzIsIGNvdW50c19DUE1sb2cyX2ZpbHRlcmVkLCBjb3VudHNfQ1BNbG9nMl9maWx0ZXJlZG5vcm1lZCwgY291bnRzX0RlU2VxMiwgY291bnRzX1ZTVCwgRGVTZXEyX29iamVjdCwgREdFX29iamVjdCwgREdFX29iamVjdF9maWx0ZXJlZCwgREdFX29iamVjdF9maWx0ZXJlZG5vcm1lZCkNCmBgYA0KDQoNCiMjIyBPdmVydmlldyBhbmFseXNpcyBvZiB0aGUgZGF0YXNldCAgDQoNCl9fT3ZlcnZpZXcgYW5hbHlzaXMgb2YgdGhlIGRhdGFzZXQgKHRvcCB2YXJpYWJsZSBnZW5lcylfXw0KDQpgciBlbW86OmppKCJtYWduaWZ5aW5nIGdsYXNzIHRpbHRlZCByaWdodCIpYCBUbyBnZXQgYSBmaXJzdCBpbXByZXNzaW9uIG9mIHRoZSBkYXRhc2V0LCB3ZSB3aWxsIGNhbGN1bGF0ZSBleHBsb3JhdG9yeSBQQ0FzIG9uIGFsbCBtb3N0IHZhcmlhYmxlIGdlbmVzIGluIHRoZSBkYXRhc2V0LCByZWdhcmRsZXNzIG9mIHRoZSBiaW9sb2dpY2FsIHByb2Nlc3NlcyBpbiB3aGljaCB0aGV5IGFyZSBpbnZvbHZlZC4gX19XaGF0IGdlbmVzIHNlcGFyYXRlIF9BLiBvY2VsbGFyaXNfIGxhcnZhZSBhY3Jvc3MgdGhlIGRhdGFzZXQ/X18NCg0KPGJyIC8+DQoqIF9fU3RlcCAxOl9fIEZvciBQQ0EgYW5kIHZpc3VhbGlzYXRpb24sIHdlIHdpbGwgdXNlIHRoZSBWU1QgdHJhbnNmb3JtZWQgb2JqZWN0IChEZVNlcTIgb2JqZWN0IHdpdGggIFZhcmlhbmNlIFN0YWJpbGlzaW5nIFRyYW5zZm9ybWF0aW9uIGFwcGxpZWQsIHNlZSBwcmV2aW91cyBzZWN0aW9uKToNCiAgQmVsb3csIGFuIG92ZXJ2aWV3IG9mIHRoZSBtYWluIGNvdW50IGZlYXR1cmVzIG9mIHRoaXMgc3RhcnRpbmcgb2JqZWN0DQoNCg0KYGBge3IsIGZpZy53aWR0aD0xNSwgZmlnLmhlaWdodD0xMCwgd2FybmluZz0gRkFMU0UsIGVjaG89RkFMU0V9DQojRm9yIFBDQSBhbmQgdmlzdWFsaXNhdGlvbiwgd2Ugd2lsbCB1c2UgdGhlIFZTVCB0cmFuc2Zvcm1lZCBvYmplY3QuIA0KI0xvYWQgdGhlIG9iamVjdCAiY291bnRzX1ZTVCIgYW5kIHBsb3Qgc3VtbWFyeSBwbG90cyBhcyByZW1pbmRlcg0KDQpsb2FkKCJEOi8vQW9jZWxsYXJpc19DUEZfTVBJX1QzL1NhdmVkX29iamVjdHMvY291bnRzX1ZTVC5yZHMiKQ0KDQojIHNldCBzcGFjZSBmb3IgNSBwbG90cw0KcGFyKG1mcm93PWMoMiwzKSkNCg0KDQpwbG90KDE6MTAwLCB0eXBlPSJuIiwgeGF4dD0ibiIsIHlheHQ9Im4iLCBidHk9Im4iLCB4bGFiPSIiLCB5bGFiPSIiKQ0KdGV4dCh4PTUwLCB5PTUwLCAiU3VtbWFyeSBwYXJhbWV0ZXJzIFxuIG9mIGxvYWRlZCBWU1Qgb2JqZWN0IiwgY2V4PTEuMikNCg0KI0xJQlJBUlkgU0laRVMNCg0KYmFycGxvdChjb2xTdW1zKGNvdW50c19WU1QpLzEwMDAsIA0KICAgICAgICBuYW1lcz1jb2xuYW1lcyhjb3VudHNfVlNUKSwgICAgICAgICAgICAgICAgICAjIHVzZSBzYW1wbGUgbmFtZXMNCiAgICAgICAgbGFzPTIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBUaGUgbGFzIGFyZ3VtZW50IHJvdGF0ZXMgdGhlIGF4aXMgbmFtZXMNCiAgICAgICAgYW5uPUZBTFNFLCANCiAgICAgICAgY2V4Lm5hbWVzPTAuNzUsDQogICAgICAgIGNvbCA9IGNvbG9yX2xpc3QsDQogICAgICAgIGJvcmRlciA9IE5BLA0KICAgICAgICB5bGltPXJhbmdlKHByZXR0eShjKDAsIG1heChjb2xTdW1zKGNvdW50c19WU1QpLzEwMDApKzUwKSkpDQogICAgICAgICkNCm10ZXh0KHNpZGUgPSAxLCB0ZXh0ID0gIiIsIGxpbmUgPSA0KQ0KbXRleHQoc2lkZSA9IDIsIHRleHQgPSAiTGlicmFyeSBzaXplICh0aG91c2FuZHMpIiwgbGluZSA9IDMpDQp0aXRsZSgiRWZmZWN0aXZlIExpYnJhcnkgc2l6ZSIpDQoNCiNCT1hQTE9UIENPVU5UUw0KDQpib3hwbG90KGFzLm1hdHJpeChjb3VudHNfVlNUKSwgDQogICAgICAgIHhsYWI9IiIsIA0KICAgICAgICB5bGFiPSJsb2cyICh2c3QtdHJhbnNmb3JtZWQgY291bnRzKSIsDQogICAgICAgIHlsaW09YygwLDIwKSwNCiAgICAgICAgbGFzPTIsDQogICAgICAgIGNvbCA9IGNvbG9yX2xpc3QsDQogICAgICAgIGJvcmRlciA9ICJncmF5IikNCiMgTGV0J3MgYWRkIGEgYmx1ZSBob3Jpem9udGFsIGxpbmUgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgbWVkaWFuIGxvZ0NQTQ0KYWJsaW5lKGg9bWVkaWFuKGFzLm1hdHJpeChjb3VudHNfVlNUKSksY29sPSJibHVlIikNCnRpdGxlKCJCb3hwbG90cyBvZiBWU1QgY291bnRzIikNCg0KDQojQ09VTlQgREVOU0lUWSBESVNUUklCVVRJT04NCiMgR2V0IHNvbWUgbmljZSBjb2xvdXJzIGZvciBwbG90dGluZw0KIyBkZWZpbmUgYSBjb2xvdXIgcGFsZXR0ZQ0KbXlwYWxldHRlIDwtIGJyZXdlci5wYWwoOSwiQmx1ZXMiKSAjZnVuY3Rpb24uIOKAnFJkWWxCdeKAnSBpcyBhIGNvbW1vbiBjaG9pY2UsIGFuZCDigJxTcGVjdHJhbOKAnSBpcyBhbHNvIG5pY2UuDQojIGRlZmluZSBhIGN1c3RvbSBmdW5jdGlvbiAibW9yZWNvbHMiIHRoYXQgY29udmVydHMgYSBwYWxldHRlIGluIGEgY29udGludW91cyBzZXJpZXMNCm1vcmVjb2xzIDwtIGNvbG9yUmFtcFBhbGV0dGUobXlwYWxldHRlKQ0KDQpwbG90KGRlbnNpdHkoY291bnRzX1ZTVFssIDFdKSwgDQogICAgIG1haW49IiIsDQogICAgIGNvbCA9IGNvbG9yX2xpc3RbMV0sDQogICAgIHhsYWI9In4gbG9nMihzY2FsZWQgY291bnRzKSIsDQogICAgIHlsYWI9IkRlbnNpdHkiLA0KICAgICB5bGltPXJhbmdlKHByZXR0eShjKDAsIDAuMjUpKSkpDQoNCmZvciAoaSBpbiAyOm5jb2woY291bnRzX1ZTVCkpIHsNCiAgbGluZXMoZGVuc2l0eShjb3VudHNfVlNUWywgaV0pLCANCiAgICAgICAgY29sPSBjb2xvcl9saXN0W2ldDQogICAgICAgICkNCiAgdGl0bGUobWFpbiA9IE5VTEwpDQp9DQojIExldCdzIGFkZCBhIGJsdWUgdmVydGljYWwgbGluZSB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBtZWRpYW4gbG9nQ1BNDQphYmxpbmUodj1tZWRpYW4oYXMubWF0cml4KGNvdW50c19WU1QpKSxjb2w9ImJsdWUiKQ0KdGl0bGUoIkRlbnNpdHkgZGlzdHJpYnV0aW9uIG9mIFZTVCBjb3VudHMiKQ0KDQojTUVBTi1WQVJJQU5DRSBQTE9UDQojIGRlZmluZSBhIGZ1bmN0aW9uIHRoYXQgY2FsY3VsYXRlcyB2YXJpYW5jZQ0Kcm93VmFyIDwtIGZ1bmN0aW9uKHgpIGFwcGx5KHgsMSx2YXIpDQoNCnBsb3Qocm93TWVhbnMoY291bnRzX1ZTVCkscm93VmFyKGNvdW50c19WU1QpLA0KICAgICB4bGFiPSdNZWFuIGNvdW50JywNCiAgICAgeWxhYj0nVmFyaWFuY2UnLA0KICAgICBjb2wgPSBhbHBoYSgiYmxhY2siLCAwLjUpLA0KICAgICBtYWluPSJWU1QiKQ0KDQoNCiNSTEUgUExPVFMNClJMRV9jb3VudHNWU1RfZm9yZ2dwbG90IDwtIHN3ZWVwKGxvZzIoY291bnRzX1ZTVCswLjI1KSwgTUFSR0lOPTEsIFNUQVRTPSByb3dNZWFucyhsb2cyKGNvdW50c19WU1QrMC4yNSkpKQ0KUkxFX2NvdW50c1ZTVF9mb3JnZ3Bsb3QkZ2VuZXMgPC0gcm93Lm5hbWVzKFJMRV9jb3VudHNWU1RfZm9yZ2dwbG90KQ0KUkxFX2NvdW50c1ZTVF9mb3JnZ3Bsb3QgIDwtIFJMRV9jb3VudHNWU1RfZm9yZ2dwbG90ICAlPiUgIHBpdm90X2xvbmdlcigtZ2VuZXMsIG5hbWVzX3RvID0gIkNvbmRpdGlvbiIsIHZhbHVlc190byA9ICJkZXZpYXRpb25zIikNCiNsb2NrIGluIHRoZSBvcmRlciBvZiB0aGUgc2FtcGxlcywgb3IgdGhleSB3aWxsIGJlIHJlYXJyYW5nZWQgZHVyaW5nIHBsb3R0aW5nDQpSTEVfY291bnRzVlNUX2ZvcmdncGxvdCRDb25kaXRpb24gPC0gZmFjdG9yKFJMRV9jb3VudHNWU1RfZm9yZ2dwbG90JENvbmRpdGlvbiwgbGV2ZWxzID0gIG9yZGVyZWRfbGV2ZWxzKQ0KDQojc2luY2UgdGhpcyBpcyBhIGdncGxvdCBhbmQgd2Ugd2FudCB0byAgcGxvdCBpdCB3aXRoIGJhc2VSIHBsb3RzLCB3ZSBuZWVkIHRvIGRvIHRoaXMNCiNodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8xNDEyNDM3My9jb21iaW5lLWJhc2UtYW5kLWdncGxvdC1ncmFwaGljcy1pbi1yLWZpZ3VyZS13aW5kb3cNCnBsb3QubmV3KCkgICAgICAgICAgICAgIA0KdnBzIDwtIGJhc2VWaWV3cG9ydHMoKQ0KcHVzaFZpZXdwb3J0KHZwcyRmaWd1cmUpICMjICAgSSBhbSBpbiB0aGUgc3BhY2Ugb2YgdGhlIFJMRSBwbG90cw0KdnAxIDwtcGxvdFZpZXdwb3J0KGMoMS44LDEsMCwxKSkgIyMgY3JlYXRlIG5ldyB2cCB3aXRoIG1hcmdpbnMsIHlvdSBwbGF5IHdpdGggdGhpcyB2YWx1ZXMgDQojcHJlcGFyZSB0aGUgYWN0dWFsIGdncGxvdA0KcGxvdDYgPC0gZ2dwbG90KFJMRV9jb3VudHNWU1RfZm9yZ2dwbG90LCBhZXMoeD1Db25kaXRpb24sIHk9ZGV2aWF0aW9ucywgZmlsbD1Db25kaXRpb24pKSArDQogIGdlb21fdmlvbGluKHRyaW09RkFMU0UpKw0KICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9Y29sb3JfbGlzdCkrDQogICNnZW9tX2ppdHRlcihzaGFwZT0xNiwgcG9zaXRpb249cG9zaXRpb25faml0dGVyKDAuMiksIGFscGhhPTAuMDEpICsNCiAgI2dlb21fYm94cGxvdCh3aWR0aD0wLjEsIG91dGxpZXIuY29sb3IgPSAiYmxhY2siLCBvdXRsaWVyLmFscGhhPTAuMDEpKw0KICBzdGF0X3N1bW1hcnkoZnVuPW1lZGlhbiwgcGNoPTIxLCBzaXplPTAuNSwgY29sb3I9ImJsYWNrIiwgZmlsbD0iZG9kZ2VyYmx1ZSIpKw0KICB0aGVtZV9jbGFzc2ljKCkrDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIHZqdXN0ID0gMC41LCBoanVzdD0xKSkrDQogIGdlb21faGxpbmUoeWludGVyY2VwdD0wLCBsaW5ldHlwZT0ibG9uZ2Rhc2giLCBjb2xvciA9ICJkb2RnZXJibHVlIiwgc2l6ZT0wLjUpKw0KICB5bGltKGMoLTEsMSkpKw0KICB4bGFiKCIiKSArIA0KICB5bGFiKCJSZWxhdGl2ZSBsb2cyIGV4cHJlc3Npb24gb2YgZWFjaCBnZW5lIChleHByZXNzaW9uLW1lYW4pIikrDQogIGdndGl0bGUoIlJlbGF0aXZlIExldmVscyBvZiBFeHByZXNzaW9uOiBEZVNlcTItVlNUIikrDQogIE5VTEwNCiNwcmludCB0aGUgZ2dwbG90IGluIHRoZSBjb3JyZWN0IHZpZXdwb3J0DQpwcmludChwbG90Nix2cCA9IHZwMSkNCg0KIyNyZW1vdmUgdW51c2VkIHZhcmlhYmxlcyBhbmQgZnVuY3Rpb25zDQpybShteXBhbGV0dGUsIG1vcmVjb2xzLCBpLCBSTEVfY291bnRzVlNUX2ZvcmdncGxvdCwgcm93VmFyLCB2cDEsIHZwcywgcGxvdDYpDQpgYGANCg0KPGJyIC8+DQoqIF9fU3RlcCAyYTpfXyBXZSBub3cgY2FuIHN1YnNldCBvdXIgY291bnRzIG1hdHJpeCwgdG8ganVzdCBrZWVwIHRoZSBtb3N0IHZhcmlhYmxlIGdlbmVzLiBUaGlzIHRocmVzaG9sZCBjb3VsZCBiZSBjaG9zZW4gYXJiaXRyYXJpbHkgYmFzZWQgZWl0aGVyIG9uIG51bWJlciBvZiBnZW5lcyAoaS5lLiB0aGUgdG9wMjAwMCBtb3N0IHZhcmlhYmxlIGdlbmVzKSwgb3Igb24gdmFyaWFuY2Ugb2YgdGhlc2UgZ2VuZXMgKGkuZS4gdGhlIGdlbmVzIHdpdGggdG9wIDEwJSB2YXJpYW5jZSkuIERpZmZlcmVudCBwb3NzaWJsZSB0aHJlc2hvbGRzIG9uIHRoaXMgZGF0YXNldCBhcmUgaWxsdXN0cmF0ZWQgYmVsb3c6DQoNCmBgYHtyLCBmaWcud2lkdGg9MjAsIGZpZy5oZWlnaHQ9MywgZWNobz1GQUxTRX0NCnBhcihtZnJvdz1jKDEsNykpDQojIGRlZmluZSBhIGZ1bmN0aW9uIHRoYXQgY2FsY3VsYXRlcyB2YXJpYW5jZQ0Kcm93VmFyIDwtIGZ1bmN0aW9uKHgpIGFwcGx5KHgsMSx2YXIpDQp2YXJfZ2VuZXMgPC0gYXBwbHkoY291bnRzX1ZTVCwgMSwgdmFyKQ0KDQojZGVmaW5lIHRpZXJzIG9mIGdlbmVzDQp0b3AxcGVyY2VudCA8LSByb3VuZCgwLjAxKm5yb3coY291bnRzX1ZTVCkpDQp0b3AycGVyY2VudCA8LSByb3VuZCgwLjAyKm5yb3coY291bnRzX1ZTVCkpDQp0b3A1cGVyY2VudCA8LSByb3VuZCgwLjA1Km5yb3coY291bnRzX1ZTVCkpDQp0b3AxMHBlcmNlbnQgPC0gIHJvdW5kKDAuMSpucm93KGNvdW50c19WU1QpKQ0KdG9wMTVwZXJjZW50IDwtICByb3VuZCgwLjE1Km5yb3coY291bnRzX1ZTVCkpDQp0b3AyMHBlcmNlbnQgPC0gIHJvdW5kKDAuMipucm93KGNvdW50c19WU1QpKSANCg0KDQojTUVBTi1WQVJJQU5DRSBQTE9UDQpwbG90KHJvd01lYW5zKGNvdW50c19WU1QpLHJvd1Zhcihjb3VudHNfVlNUKSwgcGNoID0gMTksDQogICAgIHhsYWI9J01lYW4gY291bnQnLA0KICAgICB5bGFiPSdWYXJpYW5jZScsDQogICAgIGNvbD1hbHBoYSgiYmxhY2siLCAwLjUpLA0KICAgICBtYWluPSJWU1QiKQ0KDQoNCiNNRUFOLVZBUklBTkNFIFBMT1QgdG9wMjAlDQpwbG90KHJvd01lYW5zKGNvdW50c19WU1QpLHJvd1Zhcihjb3VudHNfVlNUKSxwY2ggPSAxOSwNCiAgICAgeGxhYj0nTWVhbiBjb3VudCcsDQogICAgIHlsYWI9J1ZhcmlhbmNlJywNCiAgICAgY29sPWlmZWxzZShyb3duYW1lcyhjb3VudHNfVlNUKSAlaW4lIG5hbWVzKHNvcnQodmFyX2dlbmVzLCBkZWNyZWFzaW5nPVRSVUUpKVsxOnRvcDIwcGVyY2VudF0sIGFscGhhKCJvcmNoaWQiLCAwLjUpLCBhbHBoYSgiYmxhY2siLCAwLjUpKSwNCiAgICAgbWFpbj1wYXN0ZTAoIlZTVCAoVG9wIDIwJS0iLHRvcDIwcGVyY2VudCwgIiBnZW5lcykiKSkNCg0KI01FQU4tVkFSSUFOQ0UgUExPVCB0b3AxNSUNCnBsb3Qocm93TWVhbnMoY291bnRzX1ZTVCkscm93VmFyKGNvdW50c19WU1QpLHBjaCA9IDE5LA0KICAgICB4bGFiPSdNZWFuIGNvdW50JywNCiAgICAgeWxhYj0nVmFyaWFuY2UnLA0KICAgICBjb2w9aWZlbHNlKHJvd25hbWVzKGNvdW50c19WU1QpICVpbiUgbmFtZXMoc29ydCh2YXJfZ2VuZXMsIGRlY3JlYXNpbmc9VFJVRSkpWzE6dG9wMTVwZXJjZW50XSwgYWxwaGEoImJsdWUiLCAwLjUpLCBhbHBoYSgiYmxhY2siLCAwLjUpKSwNCiAgICAgbWFpbj1wYXN0ZTAoIlZTVCAoVG9wIDE1JS0iLHRvcDE1cGVyY2VudCwgIiBnZW5lcykiKSkNCg0KI01FQU4tVkFSSUFOQ0UgUExPVCB0b3AxMCUNCnBsb3Qocm93TWVhbnMoY291bnRzX1ZTVCkscm93VmFyKGNvdW50c19WU1QpLHBjaCA9IDE5LA0KICAgICB4bGFiPSdNZWFuIGNvdW50JywNCiAgICAgeWxhYj0nVmFyaWFuY2UnLA0KICAgICBjb2w9aWZlbHNlKHJvd25hbWVzKGNvdW50c19WU1QpICVpbiUgbmFtZXMoc29ydCh2YXJfZ2VuZXMsIGRlY3JlYXNpbmc9VFJVRSkpWzE6dG9wMTBwZXJjZW50XSwgYWxwaGEoImRvZGdlcmJsdWUiLCAwLjUpLCBhbHBoYSgiYmxhY2siLCAwLjUpKSwNCiAgICAgbWFpbj1wYXN0ZTAoIlZTVCAoVG9wIDEwJS0iLHRvcDEwcGVyY2VudCwgIiBnZW5lcykiKSkNCg0KI01FQU4tVkFSSUFOQ0UgUExPVCB0b3A1JQ0KcGxvdChyb3dNZWFucyhjb3VudHNfVlNUKSxyb3dWYXIoY291bnRzX1ZTVCkscGNoID0gMTksDQogICAgIHhsYWI9J01lYW4gY291bnQnLA0KICAgICB5bGFiPSdWYXJpYW5jZScsDQogICAgIGNvbD1pZmVsc2Uocm93bmFtZXMoY291bnRzX1ZTVCkgJWluJSBuYW1lcyhzb3J0KHZhcl9nZW5lcywgZGVjcmVhc2luZz1UUlVFKSlbMTp0b3A1cGVyY2VudF0sIGFscGhhKCJmb3Jlc3RncmVlbiIsIDAuNSksIGFscGhhKCJibGFjayIsIDAuNSkpLA0KICAgICBtYWluPXBhc3RlMCgiVlNUIChUb3AgNSUtIix0b3A1cGVyY2VudCwgIiBnZW5lcykiKSkNCg0KI01FQU4tVkFSSUFOQ0UgUExPVCB0b3AyJQ0KcGxvdChyb3dNZWFucyhjb3VudHNfVlNUKSxyb3dWYXIoY291bnRzX1ZTVCkscGNoID0gMTksDQogICAgIHhsYWI9J01lYW4gY291bnQnLA0KICAgICB5bGFiPSdWYXJpYW5jZScsDQogICAgIGNvbD1pZmVsc2Uocm93bmFtZXMoY291bnRzX1ZTVCkgJWluJSBuYW1lcyhzb3J0KHZhcl9nZW5lcywgZGVjcmVhc2luZz1UUlVFKSlbMTp0b3AycGVyY2VudF0sIGFscGhhKCJjaG9jb2xhdGUxIiwgMC41KSwgYWxwaGEoImJsYWNrIiwgMC41KSksDQogICAgIG1haW49cGFzdGUwKCJWU1QgKFRvcCAyJS0iLHRvcDJwZXJjZW50LCAiIGdlbmVzKSIpKQ0KDQojTUVBTi1WQVJJQU5DRSBQTE9UIHRvcDElDQpwbG90KHJvd01lYW5zKGNvdW50c19WU1QpLHJvd1Zhcihjb3VudHNfVlNUKSxwY2ggPSAxOSwNCiAgICAgeGxhYj0nTWVhbiBjb3VudCcsDQogICAgIHlsYWI9J1ZhcmlhbmNlJywNCiAgICAgY29sPWlmZWxzZShyb3duYW1lcyhjb3VudHNfVlNUKSAlaW4lIG5hbWVzKHNvcnQodmFyX2dlbmVzLCBkZWNyZWFzaW5nPVRSVUUpKVsxOnRvcDFwZXJjZW50XSwgYWxwaGEoImxpZ2h0Y29yYWwiLCAwLjUpLCBhbHBoYSgiYmxhY2siLCAwLjUpKSwNCiAgICAgbWFpbj1wYXN0ZTAoIlZTVCAoVG9wIDElLSIsdG9wMXBlcmNlbnQsICIgZ2VuZXMpIikpDQoNCg0KI3Bsb3Qocm93TWVhbnMoY291bnRzX1ZTVCkscm93VmFyKGNvdW50c19WU1QpLCBwY2ggPSAxOSwNCiMgICAgIHhsYWI9J01lYW4gY291bnQnLA0KIyAgICAgeWxhYj0nVmFyaWFuY2UnLA0KIyAgICAgY29sPWlmZWxzZShyb3duYW1lcyhjb3VudHNfVlNUKSAlaW4lIG5hbWVzKHNvcnQodmFyX2dlbmVzLCBkZWNyZWFzaW5nPVRSVUUpKVsxOnRvcDFwZXJjZW50XSwgDQojICAgICAgICAgICAgICAgIGFscGhhKCJsaWdodGNvcmFsIiwgMC41KSwgDQojICAgICAgICAgICAgICAgIGlmZWxzZShyb3duYW1lcyhjb3VudHNfVlNUKSAlaW4lIG5hbWVzKHNvcnQodmFyX2dlbmVzLCBkZWNyZWFzaW5nPVRSVUUpKVsxOnRvcDJwZXJjZW50XSwgDQojICAgICAgICAgICAgICAgIGFscGhhKCJjaG9jb2xhdGUxIiwgMC41KSwgDQojICAgICAgICAgICAgICAgIGlmZWxzZShyb3duYW1lcyhjb3VudHNfVlNUKSAlaW4lIG5hbWVzKHNvcnQodmFyX2dlbmVzLCBkZWNyZWFzaW5nPVRSVUUpKVsxOnRvcDVwZXJjZW50XSwgDQojICAgICAgICAgICAgICAgIGFscGhhKCJwYWxlZ3JlZW4iLCAwLjUpLCANCiMgICAgICAgICAgICAgICAgaWZlbHNlKHJvd25hbWVzKGNvdW50c19WU1QpICVpbiUgbmFtZXMoc29ydCh2YXJfZ2VuZXMsIGRlY3JlYXNpbmc9VFJVRSkpWzE6dG9wMTBwZXJjZW50XSwgDQojICAgICAgICAgICAgICAgIGFscGhhKCJkb2RnZXJibHVlIiwgMC41KSwgDQojICAgICAgICAgICAgICAgIGlmZWxzZShyb3duYW1lcyhjb3VudHNfVlNUKSAlaW4lIG5hbWVzKHNvcnQodmFyX2dlbmVzLCBkZWNyZWFzaW5nPVRSVUUpKVsxOnRvcDE1cGVyY2VudF0sIA0KIyAgICAgICAgICAgICAgICBhbHBoYSgiYmx1ZSIsIDAuNSksIA0KIyAgICAgICAgICAgICAgICBpZmVsc2Uocm93bmFtZXMoY291bnRzX1ZTVCkgJWluJSBuYW1lcyhzb3J0KHZhcl9nZW5lcywgZGVjcmVhc2luZz1UUlVFKSlbMTp0b3AyMHBlcmNlbnRdLCANCiMgICAgICAgICAgICAgICAgYWxwaGEoIm9yY2hpZCIsIDAuNSksIA0KIyAgICAgICAgICAgICAgICBhbHBoYSgiYmxhY2siLCAwLjEpKSkpKSkpLA0KIyAgICAgbWFpbj0iVlNUIikNCmBgYA0KPGJyIC8+DQoqIF9fU3RlcCAyYjpfXyBIZXJlLCB3ZSB3aWxsIHNlbGVjdCBiYXNlZCBvbiBhIHZhcmlhbmNlIHRocmVzaG9sZCwgYnV0IG5vdCBhbiBhcmliaXRyYXJ5IG9uZS4gV2Ugd3VrayBzZWxlY3QgdGhlIGdlbmVzIHdpdGggaGlnZXN0IHZhcmlhbmNlLCBiYXNlZCBvbiB0aGUgaW5mbGVjdGlvbiBwb2ludCBvZiB0aGUgdmFyaWFuY2UgZGlzdHJpYnV0aW9uIG9mIGFsbCBnZW5lcy4gQXMgcGVyIGJlbG93Og0KDQpgYGB7ciwgZmlnLndpZHRoPTE0LCBmaWcuaGVpZ2h0PTUsIGVjaG89RkFMU0V9DQojc2V0IG51bWJlciBvZiBwbG90cw0KcGFyKG1mcm93PWMoMSwzKSkNCiNkZWZpbmUgdGhlIHF1aWNrIGZ1bmN0aW9uIHRvIGNhbGN1bGF0ZSB0aGUgdmFyKCkgb2YgZWFjaCBnZW5lDQpyb3dWYXIgPC0gZnVuY3Rpb24oeCkgYXBwbHkoeCwxLHZhcikNCg0KI2dlbmVyYXRlIHRoZSBkYXRhIGFuZCBmaW5kIGluZmxlY3Rpb24gcG9pbnRzDQp2YXJpYW5jZV9kYXRhIDwtIGhpc3Qocm93VmFyKGNvdW50c19WU1QpLCANCiAgICAgICAgICAgICAgICAgICAgICBicmVha3MgPSAxMDAwLCANCiAgICAgICAgICAgICAgICAgICAgICBwbG90ID0gRkFMU0UpDQojbGV0IHVzIHN0b3JlcyBjIGFuZCB5IHZhbHVlczsgbm90ZSB3ZSBuZWVkIHRvIGFkZCB0aGUgMCB5IHZhbHVlIGF0IHRoZSAwIHggdmFsdWUNCnZhcmlhbmNlX2RhdGFfZGYgPC0gZGF0YS5mcmFtZShicmVha3MgPSB2YXJpYW5jZV9kYXRhJGJyZWFrcywgY291bnRzID0gYygwLHZhcmlhbmNlX2RhdGEkY291bnRzKSkNCiN3ZSB3YW50IHRvIGZpbmQgdGhlIGtuZWUgcG9pbnQgaW4gdGhlIGRlY3JlYXNpbmcgcGFydCBvZiB0aGUgcGxvdCwgc28gd2Ugd2lsbCBvbmx5IGNvbnNpZGVyIGxpbmVzIGFmdGVyIHRoZSBtYXhpbXVtDQprbmVlIDwtIGtuZWVkbGUodmFyaWFuY2VfZGF0YV9kZlsoMSttYXRjaChtYXgodmFyaWFuY2VfZGF0YV9kZiRjb3VudHMpLHZhcmlhbmNlX2RhdGFfZGYkY291bnRzKSk6bnJvdyh2YXJpYW5jZV9kYXRhX2RmKSwiYnJlYWtzIl0sDQogICAgICAgICAgICAgICAgdmFyaWFuY2VfZGF0YV9kZlsoMSttYXRjaChtYXgodmFyaWFuY2VfZGF0YV9kZiRjb3VudHMpLHZhcmlhbmNlX2RhdGFfZGYkY291bnRzKSk6bnJvdyh2YXJpYW5jZV9kYXRhX2RmKSwiY291bnRzIl0sDQogICAgICAgICAgICAgICAgY29uY2F2ZSA9IFQsIA0KICAgICAgICAgICAgICAgIGRlY3JlYXNpbmcgPSBULA0KICAgICAgICAgICAgICAgIHM9MSkNCiNsZXQgdXMgY2FsY3VsYXRlIG5vdyB0aGUgcmV2ZXJzZSBjdW11bGF0aXZlIGRpc3RyaWJ1dGlvbiBmdW5jdGlvbg0KdmFyaWFuY2VfZGF0YV9kZiRyZXZjdW0gPC0gcmV2KGN1bXN1bShyZXYodmFyaWFuY2VfZGF0YV9kZiRjb3VudHMpKSkNCiNzbyB0aGUgbnVtYmVyIG9mIGdlbmVzIGF2Ym92ZSB0aGF0IHZhbHVlIGlzIHRoZSBjdW11bGF0aXZlIGRpc3RyaWJ1dGlvbiBhdCB0aGUgdmFsdWUgYWZ0ZXINCnZhcmlhbmNlX2RhdGFfZGYkZ2VuZXNfYWJvdmUgPC0gdmFyaWFuY2VfZGF0YV9kZiRyZXZjdW0gLXZhcmlhbmNlX2RhdGFfZGYkY291bnRzDQoNCiNWQVJJQU5DRSBESVNUUklCVVRJT04NCnRtcDwtaGlzdChyb3dWYXIoY291bnRzX1ZTVCksIA0KICAgICBicmVha3MgPSAxMDAwLA0KICAgICBtYWluPSJHZW5lIHZhcmlhbmNlIGRpc3RyaWJ1dGlvbiAoVlNUIG9iamVjdCkiLA0KICAgICB4bGFiPSJ2YXJpYW5jZSAoczIpIiwNCiAgICAgeWxhYj0ibnVtYmVyIG9mIGdlbmVzIHdpdGggZ2l2ZW4gdmFyaWFuY2UiLA0KICAgICB5bGltID0gYygwLDI1MDApKQ0KcGFyKG5ldz1UUlVFKQ0KcGxvdCh2YXJpYW5jZV9kYXRhX2RmJGJyZWFrcyx2YXJpYW5jZV9kYXRhX2RmJGdlbmVzX2Fib3ZlLCANCiAgICAgeWxpbT1jKDAsMjIwMDApICwgDQogICAgIHR5cGU9ImwiLCBjb2w9InJlZCIsIA0KICAgICBheGVzPUZBTFNFLCB5bGFiPSIiLCB4bGFiPSIiKQ0KYXhpcyhzaWRlID0gNCkgIA0KbXRleHQoIiIsIHNpZGUgPSA0LCBsaW5lID0gMikgIA0KDQoNCiNWQVJJQU5DRSBESVNUUklCVVRJT04gKFpPT00gKyBLTkVFKQ0KaGlzdChyb3dWYXIoY291bnRzX1ZTVCksIA0KICAgICBicmVha3MgPSAxMDAwLA0KICAgICBtYWluPSJbSU5TRVRdIEdlbmUgdmFyaWFuY2UgZGlzdHJpYnV0aW9uIChWU1Qgb2JqZWN0KSIsDQogICAgIHhsYWI9InZhcmlhbmNlIChzMikiLA0KICAgICB5bGFiPSJudW1iZXIgb2YgZ2VuZXMgd2l0aCBnaXZlbiB2YXJpYW5jZSIsDQogICAgIHlsaW0gPSBjKDAsMjUwMCksDQogICAgIHhsaW0gPSBjKDAsIDEpKQ0KYWJsaW5lKHY9a25lZVsxXSxjb2w9ImJsdWUiKQ0KcGFyKG5ldz1UUlVFKQ0KcGxvdCh2YXJpYW5jZV9kYXRhX2RmJGJyZWFrcyx2YXJpYW5jZV9kYXRhX2RmJGdlbmVzX2Fib3ZlLCANCiAgICAgeWxpbT1jKDAsMjIwMDApLCB4bGltPWMoMCwxKSwgDQogICAgIHR5cGU9ImwiLCBjb2w9InJlZCIsIA0KICAgICBheGVzPUZBTFNFLCB5bGFiPSIiLCB4bGFiPSIiKQ0KYXhpcyhzaWRlID0gNCkgIA0KI2FibGluZShoPXZhcmlhbmNlX2RhdGFfZGZbbWF0Y2goYXMuY2hhcmFjdGVyKGtuZWVbWzFdXSksdmFyaWFuY2VfZGF0YV9kZiRicmVha3MpLCJnZW5lc19hYm92ZSJdLGNvbD0iYmx1ZSIpDQpzZWdtZW50cyh4MCA9IGtuZWVbWzFdXSwgeTA9IHZhcmlhbmNlX2RhdGFfZGZbbWF0Y2goYXMuY2hhcmFjdGVyKGtuZWVbWzFdXSksdmFyaWFuY2VfZGF0YV9kZiRicmVha3MpLCJnZW5lc19hYm92ZSJdLCANCiAgICAgICAgIHgxPTEuNSwgeTE9IHZhcmlhbmNlX2RhdGFfZGZbbWF0Y2goYXMuY2hhcmFjdGVyKGtuZWVbWzFdXSksdmFyaWFuY2VfZGF0YV9kZiRicmVha3MpLCJnZW5lc19hYm92ZSJdLCBjb2w9ImJsdWUiKQ0KbXRleHQoIiIsIHNpZGUgPSA0LCBsaW5lID0gMikgIA0KDQoNCg0KDQojTUVBTi1WQVJJQU5DRSBQTE9UDQojIGRlZmluZSBhIGZ1bmN0aW9uIHRoYXQgY2FsY3VsYXRlcyB2YXJpYW5jZQ0Kcm93VmFyIDwtIGZ1bmN0aW9uKHgpIGFwcGx5KHgsMSx2YXIpDQoNCnBsb3Qocm93TWVhbnMoY291bnRzX1ZTVCkscm93VmFyKGNvdW50c19WU1QpLCBjZXg9MC4xLA0KICAgICB4bGFiPSdNZWFuIGNvdW50JywNCiAgICAgeWxhYj0nVmFyaWFuY2UnLCANCiAgICAgY29sPWlmZWxzZShyb3duYW1lcyhjb3VudHNfVlNUKSAlaW4lIG5hbWVzKHNvcnQodmFyX2dlbmVzLCBkZWNyZWFzaW5nPVRSVUUpKVsxOnZhcmlhbmNlX2RhdGFfZGZbbWF0Y2goYXMuY2hhcmFjdGVyKGtuZWVbWzFdXSksdmFyaWFuY2VfZGF0YV9kZiRicmVha3MpLCJnZW5lc19hYm92ZSJdXSwgYWxwaGEoImRvZGdlcmJsdWUiLCAwLjUpLCBhbHBoYSgiYmxhY2siLCAwLjUpKSwNCiAgICAgbWFpbj0iVlNUIikNCmFibGluZShoPWtuZWVbWzFdXSxjb2w9InJlZCIpDQoNCg0KDQojcHJpbnQgZGF0YQ0KcGFzdGUwKCJUaGUgc2FtcGxlIHZhcmlhbmNlIGN1dG9mZiBvZiBzXjI+Iiwga25lZVtbMV1dICwiIGhhcyBiZWVuIHNlbGVjdGVkIGJhc2VkIG9uIHRoZSBrbmVlZGxlIGFsZ29yaXRobSIpDQpwYXN0ZTAoIlRoZXJlIGFyZSAiLCB2YXJpYW5jZV9kYXRhX2RmW21hdGNoKGFzLmNoYXJhY3RlcihrbmVlW1sxXV0pLHZhcmlhbmNlX2RhdGFfZGYkYnJlYWtzKSwiZ2VuZXNfYWJvdmUiXSwgIiBnZW5lcyB3aG9zZSB2YXJpYW5jZSBhY3Jvc3MgYWxsIHNhbXBsZXMgaXMgYWJvdmUgdGhpcyB0aHJlc2hvbGQgKCIsIHJvdW5kKHZhcmlhbmNlX2RhdGFfZGZbbWF0Y2goYXMuY2hhcmFjdGVyKGtuZWVbWzFdXSksdmFyaWFuY2VfZGF0YV9kZiRicmVha3MpLCJnZW5lc19hYm92ZSJdKjEwMC9ucm93KGNvdW50c19WU1QpLCBkaWdpdHM9MiksICIlIG9mIGFsbCBnZW5lcykiKQ0KYGBgDQoNCmBgYHtyLCBlY2hvPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQ0KI2NoZWNrIHRoYXQgdGhlIFJzdHVkaW8gdmFyKCkgZnVuY3Rpb24gaXMgdXNpbmcgdGhlIHRoZSBzYW1wbGUgbWVhbiBhcyBkZW5vbWluYXRvciAoaS5lLiBuLTEpDQp2YXJfZ2VuZXMgPC0gYXBwbHkoY291bnRzX1ZTVCwgMSwgdmFyKQ0Kc2FtcGxlX21lYW4gPC0gc3VtKChjb3VudHNfVlNUWzEsXS1yb3dNZWFucyhjb3VudHNfVlNUWzEsXSkpXjIpLyhuY29sKGNvdW50c19WU1QpLTEpDQpwYXN0ZTAoIkZvciBnZW5lIDEsIHRoZSBmdW5jdGlvbiB2YXIoKSBpcyBjYWxjdWxhdGluZzogIix2YXJfZ2VuZXNbWzFdXSkNCnBhc3RlMCgiRm9yIGdlbmUgMSwgdGhlIG1hbnVhbGx5LWNhbGN1bGF0ZWQgc2FtcGxlIG1lYW4gaXMgOiIsc2FtcGxlX21lYW4gKQ0KYGBgDQoNCg0KPGJyIC8+DQoqIF9fU3RlcCAzOl9fIFdlIGNhbiBub3cgc3Vic2V0IG91ciBvYmplY3QuIEluIHRoaXMgY2FzZSwgd2UgYXJlIHRodXMgdXNpbmcgMzQxOCBnZW5lcywgdGhlIG1vc3QgdmFyaWFibGUgb25lcy4gICBUaGUgcGxvdHMgYmVsb3cgc2hvdyB0aGUgc3VtbWFyeSBwcm9wZXJ0aWVzIG9mIHRoaXMgc3Vic2V0IChub3RlIGluZGVlZCB0aGUgaGlnaCB2YXJpYW5jZSkuIEluIGJsdWUgaW4gdGhlIG1lYW4tdmFyaWFuY2UgcGxvdCBgciBlbW86OmppKCJzbWFsbCBibHVlIGRpYW1vbmQiKWAsIHRoZSBnZW5lcyB0aGF0IGhhdmUgYmVlbiBzZWxlY3RlZCBvdXQgb2YgYWxsIG9mIHRoZSBnZW5lcyBpbiB0aGUgb3JpZ2luYWwgb2JqZWN0Lg0KDQpgYGB7ciwgZmlnLndpZHRoPTQsIGZpZy5oZWlnaHQ9NCwgZWNobz1GQUxTRX0NCiMjIEZvciB0aGUgUENBIGFuZCBjbHVzdGVyaW5nIGFuYWx5c2lzLCB3ZSB3aWxsIG9ubHkgdXNlIHRoZSBwYXJ0IG9mIHRoZSBkYXRhc2V0IHRoYXQgaGFzIHRoZSAxMDAwIGdlbmVzIHdpdGggdGhlIGhpZ2hlc3QgdmFyaWFuY2UNCiMgRXN0aW1hdGUgdGhlIHZhcmlhbmNlIGZvciBlYWNoIHJvdyBpbiBvdXIgY291bnRzX1ZTVCBzdGFydGluZyBvYmplY3QNCnZhcl9nZW5lcyA8LSBhcHBseShjb3VudHNfVlNULCAxLCB2YXIpDQojIEdldCB0aGUgZ2VuZSBuYW1lcyBmb3IgdGhlIHRvcCAxMDAwIG1vc3QgdmFyaWFibGUgZ2VuZXMNCnRvcF9nZW5lcyA8LSBuYW1lcyhzb3J0KHZhcl9nZW5lcywgZGVjcmVhc2luZz1UUlVFKSlbMTp2YXJpYW5jZV9kYXRhX2RmW21hdGNoKGFzLmNoYXJhY3RlcihrbmVlW1sxXV0pLHZhcmlhbmNlX2RhdGFfZGYkYnJlYWtzKSwiZ2VuZXNfYWJvdmUiXV0gI1sxOjIwMDBdIGlmIHlvdSB3YW50IHRvIHB1dCBhIHByZWNpc2UgbnVtYmVyIChlZyBUb3AyMDAwIGdlbmVzKQ0KIyBTdWJzZXQgdnN0IG1hdHJpeA0KY291bnRzX1ZTVF90b3AyMDAwIDwtIGNvdW50c19WU1RbdG9wX2dlbmVzLF0NCg0KI3JlbW92ZSB1bnVzZWQgdmFyaWFibGVzDQpybSh2YXJfZ2VuZXMpDQpgYGANCg0KYGBge3IsIGZpZy53aWR0aD0xNSwgZmlnLmhlaWdodD0xMCwgd2FybmluZz0gRkFMU0UsIGVjaG89RkFMU0V9DQojIyBMZXQgdXMgcmVhbmFseXNlIHRoZSBzdWJzZXQgb2YganVzdCB0b3AyMDAwIGdlbmVzDQoNCiMgc2V0IHNwYWNlIGZvciA1IHBsb3RzDQpwYXIobWZyb3c9YygyLDMpKQ0KDQoNCnBsb3QoMToxMDAsIHR5cGU9Im4iLCB4YXh0PSJuIiwgeWF4dD0ibiIsIGJ0eT0ibiIsIHhsYWI9IiIsIHlsYWI9IiIpDQp0ZXh0KHg9NTAsIHk9NTAsICJTdW1tYXJ5IHBhcmFtZXRlcnMgXG4gb2YgVG9wNzUwIG1vc3QgdmFyaWFudCBnZW5lcyIsIGNleD0xLjIpDQoNCiNNRUFOLVZBUklBTkNFIFBMT1QgKGhpZ2hsaWdodGluZyB0b3AgMjAwMHZhcmlhbnQgZ2VuZXMgaW4gY29sb3VyKQ0KIyBkZWZpbmUgYSBmdW5jdGlvbiB0aGF0IGNhbGN1bGF0ZXMgdmFyaWFuY2UNCnJvd1ZhciA8LSBmdW5jdGlvbih4KSBhcHBseSh4LDEsdmFyKQ0KDQpwbG90KHJvd01lYW5zKGNvdW50c19WU1QpLHJvd1Zhcihjb3VudHNfVlNUKSwNCiAgICAgeGxhYj0nTWVhbiBjb3VudCcsDQogICAgIHlsYWI9J1ZhcmlhbmNlJywNCiAgICAgY29sPWlmZWxzZShyb3duYW1lcyhjb3VudHNfVlNUKSAlaW4lIHRvcF9nZW5lcywgYWxwaGEoImRvZGdlcmJsdWUiLCAwLjUpLCBhbHBoYSgiYmxhY2siLCAwLjUpKSwNCiAgICAgbWFpbj0iVlNUIG9iamVjdDogbWVhbi12YXJpYW5jZSBwbG90IChhbGwgZ2VuZXMpIikNCg0KDQojTElCUkFSWSBTSVpFUw0KDQpiYXJwbG90KGNvbFN1bXMoY291bnRzX1ZTVF90b3AyMDAwKS8xMDAwLCANCiAgICAgICAgbmFtZXM9Y29sbmFtZXMoY291bnRzX1ZTVF90b3AyMDAwKSwgICAgICAgICAgICAgICAgICAjIHVzZSBzYW1wbGUgbmFtZXMNCiAgICAgICAgbGFzPTIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBUaGUgbGFzIGFyZ3VtZW50IHJvdGF0ZXMgdGhlIGF4aXMgbmFtZXMNCiAgICAgICAgYW5uPUZBTFNFLCANCiAgICAgICAgY2V4Lm5hbWVzPTAuNzUsDQogICAgICAgIGNvbCA9IGNvbG9yX2xpc3QsDQogICAgICAgIGJvcmRlciA9IE5BLA0KICAgICAgICB5bGltPXJhbmdlKHByZXR0eShjKDAsIG1heChjb2xTdW1zKGNvdW50c19WU1RfdG9wMjAwMCkvMTAwMCkpKSkNCiAgICAgICAgKQ0KbXRleHQoc2lkZSA9IDEsIHRleHQgPSAiU2FtcGxlcyIsIGxpbmUgPSA0KQ0KbXRleHQoc2lkZSA9IDIsIHRleHQgPSAiTGlicmFyeSBzaXplICh0aG91c2FuZHMpIiwgbGluZSA9IDMpDQp0aXRsZSgiRWZmZWN0aXZlIExpYnJhcnkgc2l6ZSBvbiBtb3N0IHZhcmlhbnQgZ2VuZXMiKQ0KDQojQk9YUExPVCBDT1VOVFMNCg0KYm94cGxvdChhcy5tYXRyaXgoY291bnRzX1ZTVF90b3AyMDAwKSwgDQogICAgICAgIHhsYWI9IiIsIA0KICAgICAgICB5bGFiPSJsb2cyICh2c3QtdHJhbnNmb3JtZWQgY291bnRzKSIsDQogICAgICAgIHlsaW09YygwLDIwKSwNCiAgICAgICAgbGFzPTIsDQogICAgICAgIGNvbCA9IGNvbG9yX2xpc3QsDQogICAgICAgIGJvcmRlciA9ICJncmF5IikNCiMgTGV0J3MgYWRkIGEgYmx1ZSBob3Jpem9udGFsIGxpbmUgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgbWVkaWFuIGxvZ0NQTQ0KYWJsaW5lKGg9bWVkaWFuKGFzLm1hdHJpeChjb3VudHNfVlNUX3RvcDIwMDApKSxjb2w9ImJsdWUiKQ0KdGl0bGUoIkJveHBsb3RzIG9mIG1vc3QgdmFyaWFudCBWU1QgY291bnRzIikNCg0KDQojQ09VTlQgREVOU0lUWSBESVNUUklCVVRJT04NCiMgR2V0IHNvbWUgbmljZSBjb2xvdXJzIGZvciBwbG90dGluZw0KIyBkZWZpbmUgYSBjb2xvdXIgcGFsZXR0ZQ0KbXlwYWxldHRlIDwtIGJyZXdlci5wYWwoOSwiQmx1ZXMiKSAjZnVuY3Rpb24uIOKAnFJkWWxCdeKAnSBpcyBhIGNvbW1vbiBjaG9pY2UsIGFuZCDigJxTcGVjdHJhbOKAnSBpcyBhbHNvIG5pY2UuDQojIGRlZmluZSBhIGN1c3RvbSBmdW5jdGlvbiAibW9yZWNvbHMiIHRoYXQgY29udmVydHMgYSBwYWxldHRlIGluIGEgY29udGludW91cyBzZXJpZXMNCm1vcmVjb2xzIDwtIGNvbG9yUmFtcFBhbGV0dGUobXlwYWxldHRlKQ0KDQpwbG90KGRlbnNpdHkoY291bnRzX1ZTVF90b3AyMDAwWywgMV0pLCANCiAgICAgbWFpbj0iIiwNCiAgICAgY29sID0gY29sb3JfbGlzdFsxXSwNCiAgICAgeGxhYj0ifiBsb2cyKHNjYWxlZCBjb3VudHMpIiwNCiAgICAgeWxhYj0iRGVuc2l0eSIsDQogICAgIHlsaW09cmFuZ2UocHJldHR5KGMoMCwgMC4yNSkpKSkNCg0KZm9yIChpIGluIDI6bmNvbChjb3VudHNfVlNUX3RvcDIwMDApKSB7DQogIGxpbmVzKGRlbnNpdHkoY291bnRzX1ZTVF90b3AyMDAwWywgaV0pLCANCiAgICAgICAgY29sPSBjb2xvcl9saXN0W2ldDQogICAgICAgICkNCiAgdGl0bGUobWFpbiA9IE5VTEwpDQp9DQojIExldCdzIGFkZCBhIGJsdWUgdmVydGljYWwgbGluZSB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBtZWRpYW4gbG9nQ1BNDQphYmxpbmUodj1tZWRpYW4oYXMubWF0cml4KGNvdW50c19WU1RfdG9wMjAwMCkpLGNvbD0iYmx1ZSIpDQp0aXRsZSgiRGVuc2l0eSBkaXN0cmlidXRpb24gb2YgbW9zdCB2YXJpYW50IFZTVCBjb3VudHMiKQ0KDQojUkxFIFBMT1RTDQpSTEVfY291bnRzVlNUX2ZvcmdncGxvdCA8LSBzd2VlcChsb2cyKGNvdW50c19WU1RfdG9wMjAwMCswLjI1KSwgTUFSR0lOPTEsIFNUQVRTPSByb3dNZWFucyhsb2cyKGNvdW50c19WU1RfdG9wMjAwMCswLjI1KSkpDQpSTEVfY291bnRzVlNUX2ZvcmdncGxvdCRnZW5lcyA8LSByb3cubmFtZXMoUkxFX2NvdW50c1ZTVF9mb3JnZ3Bsb3QpDQpSTEVfY291bnRzVlNUX2ZvcmdncGxvdCAgPC0gUkxFX2NvdW50c1ZTVF9mb3JnZ3Bsb3QgICU+JSAgcGl2b3RfbG9uZ2VyKC1nZW5lcywgbmFtZXNfdG8gPSAiQ29uZGl0aW9uIiwgdmFsdWVzX3RvID0gImRldmlhdGlvbnMiKQ0KI2xvY2sgaW4gdGhlIG9yZGVyIG9mIHRoZSBzYW1wbGVzLCBvciB0aGV5IHdpbGwgYmUgcmVhcnJhbmdlZCBkdXJpbmcgcGxvdHRpbmcNClJMRV9jb3VudHNWU1RfZm9yZ2dwbG90JENvbmRpdGlvbiA8LSBmYWN0b3IoUkxFX2NvdW50c1ZTVF9mb3JnZ3Bsb3QkQ29uZGl0aW9uLCBsZXZlbHMgPSAgb3JkZXJlZF9sZXZlbHMpDQoNCiNzaW5jZSB0aGlzIGlzIGEgZ2dwbG90IGFuZCB3ZSB3YW50IHRvICBwbG90IGl0IHdpdGggYmFzZVIgcGxvdHMsIHdlIG5lZWQgdG8gZG8gdGhpcw0KI2h0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzE0MTI0MzczL2NvbWJpbmUtYmFzZS1hbmQtZ2dwbG90LWdyYXBoaWNzLWluLXItZmlndXJlLXdpbmRvdw0KcGxvdC5uZXcoKSAgICAgICAgICAgICAgDQp2cHMgPC0gYmFzZVZpZXdwb3J0cygpDQpwdXNoVmlld3BvcnQodnBzJGZpZ3VyZSkgIyMgICBJIGFtIGluIHRoZSBzcGFjZSBvZiB0aGUgUkxFIHBsb3RzDQp2cDEgPC1wbG90Vmlld3BvcnQoYygxLjgsMSwwLDEpKSAjIyBjcmVhdGUgbmV3IHZwIHdpdGggbWFyZ2lucywgeW91IHBsYXkgd2l0aCB0aGlzIHZhbHVlcyANCiNwcmVwYXJlIHRoZSBhY3R1YWwgZ2dwbG90DQpwbG90NiA8LSBnZ3Bsb3QoUkxFX2NvdW50c1ZTVF9mb3JnZ3Bsb3QsIGFlcyh4PUNvbmRpdGlvbiwgeT1kZXZpYXRpb25zLCBmaWxsPUNvbmRpdGlvbikpICsNCiAgZ2VvbV92aW9saW4odHJpbT1GQUxTRSkrDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1jb2xvcl9saXN0KSsNCiAgI2dlb21faml0dGVyKHNoYXBlPTE2LCBwb3NpdGlvbj1wb3NpdGlvbl9qaXR0ZXIoMC4yKSwgYWxwaGE9MC4wMSkgKw0KICAjZ2VvbV9ib3hwbG90KHdpZHRoPTAuMSwgb3V0bGllci5jb2xvciA9ICJibGFjayIsIG91dGxpZXIuYWxwaGE9MC4wMSkrDQogIHN0YXRfc3VtbWFyeShmdW49bWVkaWFuLCBwY2g9MjEsIHNpemU9MC41LCBjb2xvcj0iYmxhY2siLCBmaWxsPSJkb2RnZXJibHVlIikrDQogIHRoZW1lX2NsYXNzaWMoKSsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJub25lIiwgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwgdmp1c3QgPSAwLjUsIGhqdXN0PTEpKSsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0PTAsIGxpbmV0eXBlPSJsb25nZGFzaCIsIGNvbG9yID0gImRvZGdlcmJsdWUiLCBzaXplPTAuNSkrDQogIHlsaW0oYygtMywzKSkrDQogIHhsYWIoIiIpICsgDQogIHlsYWIoIlJlbGF0aXZlIGxvZzIgZXhwcmVzc2lvbiBvZiBlYWNoIGdlbmUgKGV4cHJlc3Npb24tbWVhbikiKSsNCiAgZ2d0aXRsZSgiUkxFOiBtb3N0IHZhcmlhbnQgVlNUIGNvdW50cyIpKw0KICBOVUxMDQojcHJpbnQgdGhlIGdncGxvdCBpbiB0aGUgY29ycmVjdCB2aWV3cG9ydA0KcHJpbnQocGxvdDYsdnAgPSB2cDEpDQoNCiMjcmVtb3ZlIHVudXNlZCB2YXJpYWJsZXMgYW5kIGZ1bmN0aW9ucw0Kcm0obXlwYWxldHRlLCBtb3JlY29scywgaSwgUkxFX2NvdW50c1ZTVF9mb3JnZ3Bsb3QsIHJvd1ZhciwgdnAxLCB2cHMsIHBsb3Q2LCB0b3BfZ2VuZXMpDQpgYGANCg0KPGJyIC8+DQoNCiogX19TdGVwIDQ6X18gSW5jaWRlbnRhbGx5LCB3ZSBjYW4gaGlnaGxpZ2h0IGFuZCBsaXN0IHRoZSB0b3AxNSBnZW5lcyB0aGF0IGhhdmUgaGlnaGVzdCBleHByZXNzaW9uICh0aG91Z2ggdGhleSBtaWdodCBub3QgYmUgdGhlIHZhcmlhbnQgb25lcykNCg0KDQpgYGB7ciwgZmlnLndpZHRoPTksIGZpZy5oZWlnaHQ9MywgZWNobz1GQUxTRX0NCiNhcyBhIGN1cmlvc2l0eSwgd2UgY2FuIGhpZ2hsaWdodCBhbmQgbGlzdCB0aGUgdG9wMTAgZ2VuZXMgdGhhdGggaGF2ZSBoaWdoZXMgZXhwcmVzc2lvbiAodGhvdWdoIHRoZXkgbWlnaHQgbm90IGJlIHRoZSB2YXJpYW50IG9uZXMpDQoNCiMgc2V0IHNwYWNlIGZvciAzIHBsb3RzDQpwYXIobWZyb3c9YygxLDMpKQ0KDQoNCnBsb3QoMToxMDAsIHR5cGU9Im4iLCB4YXh0PSJuIiwgeWF4dD0ibiIsIGJ0eT0ibiIsIHhsYWI9IiIsIHlsYWI9IiIpDQp0ZXh0KHg9NTAsIHk9NTAsICJNZWFuLXZhcmlhbmNlIHBsb3QgXG4gKGhpZ2hlc3QgZXhwcmVzc2lvbiBnZW5lcyBcbiBoaWdobGlnaHRlZCBpbiBibHVlKSIsIGNleD0xLjIpDQoNCnRvcF9tZWFuX2dlbmVzIDwtIG5hbWVzKHNvcnQoYXBwbHkoY291bnRzX1ZTVCwgMSwgbWVhbiksIGRlY3JlYXNpbmc9VFJVRSkpWzE6MTVdDQp0b3BfbWVhbl9nZW5lcyA8LSBhcy5kYXRhLmZyYW1lKHRvcF9tZWFuX2dlbmVzKQ0KDQpjb2xuYW1lcyh0b3BfbWVhbl9nZW5lcykgPC0gImVudHJlel9JRCINCnRvcF9tZWFuX2dlbmVzJGRlc2NyaXB0aW9uIDwtIGFubm90YXRpb25faW5mbyRtZXJnZWRfZGVzY3JpcHRpb25bbWF0Y2godG9wX21lYW5fZ2VuZXMkZW50cmV6X0lEICxhbm5vdGF0aW9uX2luZm8kZW50cmV6X0lEKV0gDQp0b3BfbWVhbl9nZW5lcyRlbnNlbWJsX2Rlc2NyaXB0aW9uIDwtIGFubm90YXRpb25faW5mbyRlbnNlbWJsX2Rlc2NyaXB0aW9uW21hdGNoKHRvcF9tZWFuX2dlbmVzJGVudHJlel9JRCAsYW5ub3RhdGlvbl9pbmZvJGVudHJlel9JRCldDQp0b3BfbWVhbl9nZW5lcyRtZWFuX2NvdW50IDwtIHNvcnQoYXBwbHkoY291bnRzX1ZTVCwgMSwgbWVhbiksIGRlY3JlYXNpbmc9VFJVRSlbMToxNV0NCg0KI01FQU4tVkFSSUFOQ0UgUExPVCAoaGlnaGxpZ2h0aW5nIHRvcCAxMDAwdmFyaWFudCBnZW5lcyBpbiBjb2xvdXIpDQojIGRlZmluZSBhIGZ1bmN0aW9uIHRoYXQgY2FsY3VsYXRlcyB2YXJpYW5jZQ0Kcm93VmFyIDwtIGZ1bmN0aW9uKHgpIGFwcGx5KHgsMSx2YXIpDQoNCnBsb3Qocm93TWVhbnMoY291bnRzX1ZTVCkscm93VmFyKGNvdW50c19WU1QpLA0KICAgICB4bGFiPSdNZWFuIGNvdW50JywNCiAgICAgeWxhYj0nVmFyaWFuY2UnLA0KICAgICBjb2w9aWZlbHNlKHJvd25hbWVzKGNvdW50c19WU1QpICVpbiUgdG9wX21lYW5fZ2VuZXMkZW50cmV6X0lELCBhbHBoYSgiZG9kZ2VyYmx1ZSIsIDAuNSksIGFscGhhKCJibGFjayIsIDAuNSkpLA0KICAgICBtYWluPSJWU1Qgb2JqZWN0OiBtZWFuLXZhcmlhbmNlIHBsb3QgKGFsbCBnZW5lcykiKQ0KDQoNCiNsaXN0IHRvcCBjb250cmlidXRpbmcgZ2VuZXMNCiNrYWJsZSh0b3BfbWVhbl9nZW5lcywgY2FwdGlvbiA9ICJUb3AxNSBnZW5lcyB3aXRoIGhpZ2hlc3QgZXhwcmVzc2lvbiIpDQoNCiMjIEZvcm1hdHRhYmxlIG91dHB1dA0KDQpmb3JtYXR0YWJsZSh0b3BfbWVhbl9nZW5lcywgDQogICAgICAgICAgICAgY2FwdGlvbiA9IlRvcDE1IGdlbmVzIHdpdGggaGlnaGVzdCBleHByZXNzaW9uIiwNCiAgICAgICAgICAgIGFsaWduID1jKCJjIiwibCIsICJsIiwgImMiKSwgDQogICAgICAgICAgICBsaXN0KGBlbnRyZXpfSURgID0gZm9ybWF0dGVyKCJzcGFuIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlID0geCB+IHN0eWxlKA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yID0gIiNBOUE5QTkiLCBmb250LndlaWdodCA9ICJib2xkIikNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSwgDQogICAgICAgICAgICAgICAgIGBtZWFuX2NvdW50YD0gY29sb3JfdGlsZShOQSwiZG9kZ2VyYmx1ZSIpDQoNCiAgICAgICAgICAgICAgICAgKQ0KICAgICAgICAgICAgKQ0KDQojcmVtb3ZlIHVudXNlZCB2YXJpYWJsZXMNCiNybSh0b3BfbWVhbl9nZW5lcywgcm93VmFyKQ0KYGBgDQoNCg0KYGBge3IsIGVjaG89RkFMU0V9DQojd2Ugd2lsbCBhbHNvIHByaW50IHRoZSBwYXR0ZXJuIG9mIGV4cHJlc3Npb24gb2YgdGhlc2UgaGlnaGx5LWV4cHJlc3NlZCBnZW5lcw0KI2xvYWQgdGhlIGNvdW50c19WU1Qgb2JqZWN0DQpsb2FkKCJEOi8vQW9jZWxsYXJpc19DUEZfTVBJX1QzL1NhdmVkX29iamVjdHMvY291bnRzX1ZTVC5yZHMiKQ0KYGBgDQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KI3NlbGVjdCBnZW5lcw0KZ2VuZWxpc3QgPC0gdG9wX21lYW5fZ2VuZXMkZW50cmV6X0lEDQpzZWxlY3RlZF9nZW5lcyA8LSBjKGdlbmVsaXN0KQ0KYGBgDQoNCmBgYHtyLCBlY2hvPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQ0KIyBSZXR1cm5zIHRoZSBtaXNzaW5nIGdlbmVzOg0KbWlzc2luZ19nZW5lcyA8LSBhcy5kYXRhLmZyYW1lKHNldGRpZmYoc2VsZWN0ZWRfZ2VuZXMsIHJvdy5uYW1lcyhjb3VudHNfVlNUKSkpIA0KY29sbmFtZXMobWlzc2luZ19nZW5lcykgPC0gImVudHJlel9JRCINCm1pc3NpbmdfZ2VuZXMkZGVzY3JpcHRpb24gPC0gYW5ub3RhdGlvbl9pbmZvJG1lcmdlZF9kZXNjcmlwdGlvblttYXRjaChtaXNzaW5nX2dlbmVzJGVudHJlel9JRCxhbm5vdGF0aW9uX2luZm8kZW50cmV6X0lEKV0NCiNubyBtaXNzaW5nIGdlbmVzDQoNCiMgUmV0dXJucyB0aGUgZXhpc3RpbmcgZ2VuZXM6DQpzZWxlY3RlZF9nZW5lcyA8LSBhcy5kYXRhLmZyYW1lKGludGVyc2VjdChzZWxlY3RlZF9nZW5lcywgcm93Lm5hbWVzKGNvdW50c19WU1QpKSkNCmNvbG5hbWVzKHNlbGVjdGVkX2dlbmVzKSA8LSAiZW50cmV6X0lEIg0Kc2VsZWN0ZWRfZ2VuZXMkZGVzY3JpcHRpb24gPC0gYW5ub3RhdGlvbl9pbmZvJG1lcmdlZF9kZXNjcmlwdGlvblttYXRjaChzZWxlY3RlZF9nZW5lcyRlbnRyZXpfSUQsYW5ub3RhdGlvbl9pbmZvJGVudHJlel9JRCldDQoNCiNwcmludCBsaXN0IG9mIGRpY2FyZGVkIGdlbmVzIChiZWNhdXNlIG1pc3NpbmcpIGFuZCBvZiByZXRhaW5lZCBnZW5lcyAoY3VyYXRlZCBkaWdlc3Rpb24gZ2VuZXMsIHByZXNlbnQgaW4gdGhlIGRhdGFzZXQpDQoNCmthYmxlKG1pc3NpbmdfZ2VuZXMsIGNhcHRpb24gPSAiR2VuZXMgbWlzc2luZyBmcm9tIHRoZSBkYXRhc2V0IChpZ25vcmVkKSIpDQprYWJsZShzZWxlY3RlZF9nZW5lcywgY2FwdGlvbiA9ICJHZW5lcyBwcmVzZW50IGluIGRhdGFzZXQgKHJldGFpbmVkKSIpDQoNCiMjIHN1YnNldCB0aGUgb3JpZ2luYWwgVlNUIG9iamVjdHMgdG8gb25seSBrZWVwIHNlbGVjdGVkIGdlbmVzDQpjb3VudHNfVlNUX3NlbGVjdGVkZ2VuZXMgPC0gc3Vic2V0KGNvdW50c19WU1QsIHJvd25hbWVzKGNvdW50c19WU1QpICVpbiUgc2VsZWN0ZWRfZ2VuZXMkZW50cmV6X0lEKQ0KDQpyb3duYW1lcyhjb3VudHNfVlNUX3NlbGVjdGVkZ2VuZXMpIDwtIGFubm90YXRpb25faW5mbyRtZXJnZWRfZGVzY3JpcHRpb25bbWF0Y2gocm93bmFtZXMoY291bnRzX1ZTVF9zZWxlY3RlZGdlbmVzKSwgYW5ub3RhdGlvbl9pbmZvJGVudHJlel9JRCldDQoNCiNyZW1vdmUgdW51c2VkIHZhcmlhYmxlcw0Kcm0oc2VsZWN0ZWRfZ2VuZXMpDQoNCmBgYA0KDQoNCmBgYHtyLCBmaWcuaGVpZ2h0PTUsIGZpZy53aWR0aD0xMCwgZWNobz1GQUxTRX0NCg0KIyNkZWZpbmUgdGhlIGNvbG9ycyBmb3IgdGhlIGhlYXRtYXAgKGNhdGVnb3JpY2FsKTogMSBjb2xvciBmb3IgZWFjaCBzbWFsbGVzdCBleHBlcmltZW50YWwgdW5pdCB0aGF0IGlzIGJlaW5nICBjb21wYXJlZDsgaS5lLiBoZXJlIHRoZSB0cmVhdG1lbnQNCmNvbG9yX2NhdGVnb3JpY2FsX2hlYXRtYXAgPC0gY29sb3JfY2F0ZWdvcmljYWxfdHJlYXRtZW50DQojbmFtZSB0aGlzIGxpc3Qgb2YgY29sb3Igd2l0aCB0aGUgY29ycmVzcG9uZGluZyBuYW1lcyAobm90ZTogdGhlc2UgYXJlIHRoZSB1bmlxdWUgdmFsdWVzIGZvciB0aGF0IGNhdGVnb3J5IGluIHRoZSBzYW1wbGUgbWV0YWRhdGEpDQpjb2xvcl9jYXRlZ29yaWNhbF9oZWF0bWFwX25hbWVkIDwtIGNvbG9yX2NhdGVnb3JpY2FsX2hlYXRtYXANCm5hbWVzKGNvbG9yX2NhdGVnb3JpY2FsX2hlYXRtYXBfbmFtZWQpIDwtIHVuaXF1ZShzYW1wbGVfbWV0YWRhdGEkdHJlYXRtZW50KQ0KDQojbG9hZCB0aGlzIGluZm9ybWF0aW9uIGludG8gdGhlIGhlYXRtYXANCmNvbEFubiA8LSBIZWF0bWFwQW5ub3RhdGlvbigjZGYgPSBkYXRhLmZyYW1lKHRyZWF0bWVudCA9IHNhbXBsZV9tZXRhZGF0YSR0cmVhdG1lbnQpLCAjdGhlIG5hbWUgb2YgdGhlIGNvbHVtbiBuZWVkcyB0byBtYXRjaCB0aGUgbmFtZSBvZiB0aGUgbmFtZWQgbGlzdA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICNjb2wgPSBsaXN0KCJ0cmVhdG1lbnQiID0gY29sb3JfY2F0ZWdvcmljYWxfaGVhdG1hcF9uYW1lZCksICNzZXQgdGhlIG5hbWUgb2YgdGhlIG5hbWVkIGxpc3Qgc28gaXQgbWF0Y2hlcw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICNhbm5vdGF0aW9uX3dpZHRoID0gdW5pdChjKDEsIDQpLCAnY20nKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjZ2FwID0gdW5pdCgxLCAnbW0nKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3dfbGVnZW5kID0gRkFMU0UsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd19hbm5vdGF0aW9uX25hbWUgPSBGQUxTRSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGljaCA9ICdjb2wnLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICNhbHNvIGNyZWF0ZSBhbiBlbXB0eSByb3cgYWJvZSB0aGUgaGVhdG1hcCwgdG8gZGlzcGxheSBhZGRpdGlvbmFsIGluZm8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbXB0eTEgPSBhbm5vX2VtcHR5KGJvcmRlciA9IEZBTFNFLCBoZWlnaHQ9IHVuaXQoOCwgIm1tIikpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKQ0KDQoNCkhlYXRtYXAobWF0ID0gdChzY2FsZSh0KGNvdW50c19WU1Rfc2VsZWN0ZWRnZW5lcykpKSwNCiAgICAgICAgbmFtZT0gInotc2NvcmUiLA0KICAgICAgICBjb2x1bW5fdGl0bGUgPSBndF9yZW5kZXIoDQogICAgICAgICAgIlBhdHRlcm4gb2YgZXhwcmVzc2lvbiAoYXMgPHNwYW4gc3R5bGU9J2NvbG9yOmJyb3duMic+Kip6LXNjb3JlcyoqPC9zcGFuPikgPGJyLz4gb2YgdGhlIGhpZ2hlc3QtZXhwcmVzc2VkIGdlbmVzIg0KICAgICAgICAgICksDQogICAgICAgIGNvbCA9IHJldihicmV3ZXIucGFsKDExLCJSZEJ1IikpLA0KICAgICAgICBuYV9jb2wgPSAiYmxhY2siLA0KICAgICAgICBjbHVzdGVyX3Jvd3MgPSBULA0KICAgICAgICBzaG93X3Jvd19kZW5kID0gVCwNCiAgICAgICAgI3Jvd19vcmRlciA9IG9yZGVyZWRfbGV2ZWxzLA0KICAgICAgICBjbHVzdGVyX2NvbHVtbnMgPSBGQUxTRSwNCiAgICAgICAgc2hvd19jb2x1bW5fZGVuZCA9IEZBTFNFLA0KICAgICAgICAjY29sdW1uX29yZGVyID0gb3JkZXJlZF9sZXZlbHMsDQogICAgICAgICNyb3dfc3BsaXQgPSBmYWN0b3IocGFzdGUwKHNhbXBsZV9tZXRhZGF0YSRzZWdtZW50LCBzYW1wbGVfbWV0YWRhdGEkc3RhZ2UpLCBsZXZlbHMgPSBjKCJsaXZlclMxIiwgImxpdmVyUzQiLCAibGl2ZXJTNyIsICJzdG9tYWNoUzEiLCAiaW50ZXN0aW5lUzEiLCAic3RvbWFjaFM0IiwgIkFfaW50ZXN0aW5lUzQiLCAiUF9pbnRlc3RpbmVTNCIsICJzdG9tYWNoUzciLCAiQV9pbnRlc3RpbmVTNyIsICJQX2ludGVzdGluZVM3IikpLA0KICAgICAgICBjb2x1bW5fc3BsaXQgPSBmYWN0b3Ioc2FtcGxlX21ldGFkYXRhJHRyZWF0bWVudCwgbGV2ZWxzID0gYygiRE1TTyIsICJUM0lPUCIsICJNUEkiLCAiQ1BGIiwgIkNQRi5UM0lPUCIpKSwNCiAgICAgICAgI2NsdXN0ZXJfcm93X3NsaWNlcyA9IEZBTFNFLA0KICAgICAgICBjbHVzdGVyX2NvbHVtbl9zbGljZXMgPSBGQUxTRSwNCiAgICAgICAgcm93X3RpdGxlID0gTlVMTCwNCiAgICAgICAgcm93X2dhcCA9IHVuaXQoMC41LCAibW0iKSwNCiAgICAgICAgY29sdW1uX2dhcCA9IHVuaXQoYyhyZXAoMTAsMSksIHJlcCgyLDMpKSwgIm1tIiksDQogICAgICAgICN3aWR0aCA9IHVuaXQoOCwgImNtIiksIA0KICAgICAgICAjaGVpZ2h0ID0gdW5pdCg4LCAiY20iKSwNCiAgICAgICAgY29sdW1uX25hbWVzX2dwID0gZ3JpZDo6Z3Bhcihmb250c2l6ZSA9IDgpLA0KICAgICAgICByb3dfbmFtZXNfZ3AgPSBncmlkOjpncGFyKGZvbnRzaXplID0gOCksDQogICAgICAgIHRvcF9hbm5vdGF0aW9uID0gY29sQW5uLA0KICAgICAgICAjbGVmdF9hbm5vdGF0aW9uID0gcm93QW5uLA0KICAgICAgICBzaG93X2hlYXRtYXBfbGVnZW5kID0gVFJVRSwNCiAgICAgICAgYm9yZGVyID0gVFJVRSwNCiAgICAgICAgY2x1c3RlcmluZ19tZXRob2Rfcm93cyA9ICd3YXJkLkQyJw0KICAgICAgICApDQoNCg0KbGlicmFyeShHZXRvcHRMb25nKSAgIyBmb3IgdGhlIGZ1bmN0aW9uIHFxKCkNCmdyb3VwX2Jsb2NrX2Fubm8gPSBmdW5jdGlvbihncm91cCwgZW1wdHlfYW5ubywgZ3AgPSBncGFyKCksIA0KICAgIGxhYmVsID0gTlVMTCwgbGFiZWxfZ3AgPSBncGFyKCkpIHsNCg0KICAgIHNlZWtWaWV3cG9ydChxcSgiYW5ub3RhdGlvbl9Ae2VtcHR5X2Fubm99X0B7bWluKGdyb3VwKX0iKSkNCiAgICBsb2MxID0gZGV2aWNlTG9jKHggPSB1bml0KDAsICJucGMiKSwgeSA9IHVuaXQoMCwgIm5wYyIpKQ0KICAgIHNlZWtWaWV3cG9ydChxcSgiYW5ub3RhdGlvbl9Ae2VtcHR5X2Fubm99X0B7bWF4KGdyb3VwKX0iKSkNCiAgICBsb2MyID0gZGV2aWNlTG9jKHggPSB1bml0KDEsICJucGMiKSwgeSA9IHVuaXQoMSwgIm5wYyIpKQ0KDQogICAgc2Vla1ZpZXdwb3J0KCJnbG9iYWwiKQ0KICAgIGdyaWQucmVjdChsb2MxJHgsIGxvYzEkeSwgd2lkdGggPSBsb2MyJHggLSBsb2MxJHgsIGhlaWdodCA9IGxvYzIkeSAtIGxvYzEkeSwgDQogICAgICAgIGp1c3QgPSBjKCJsZWZ0IiwgImJvdHRvbSIpLCBncCA9IGdwKQ0KICAgIGlmKCFpcy5udWxsKGxhYmVsKSkgew0KICAgICAgICBncmlkLnRleHQobGFiZWwsIHggPSAobG9jMSR4ICsgbG9jMiR4KSowLjUsIHkgPSAobG9jMSR5ICsgbG9jMiR5KSowLjUsIGdwID0gbGFiZWxfZ3ApDQogICAgfQ0KfQ0KDQpncm91cF9ibG9ja19hbm5vKDE6MSwgImVtcHR5MSIsIGdwID0gZ3BhcihmaWxsID0gImdyYXk3MCIpLCBsYWJlbCA9ICJETVNPIikNCmdyb3VwX2Jsb2NrX2Fubm8oMjoyLCAiZW1wdHkxIiwgZ3AgPSBncGFyKGZpbGwgPSAicGFsZWdyZWVuMyIpLCBsYWJlbCA9ICJUMytJT1AiKQ0KZ3JvdXBfYmxvY2tfYW5ubygzOjMsICJlbXB0eTEiLCBncCA9IGdwYXIoZmlsbCA9ICJsaWdodGNvcmFsIiksIGxhYmVsID0gIk1QSSIpDQpncm91cF9ibG9ja19hbm5vKDQ6NCwgImVtcHR5MSIsIGdwID0gZ3BhcihmaWxsID0gImxpZ2h0c2t5Ymx1ZSIpLCBsYWJlbCA9ICJDUEYiKQ0KZ3JvdXBfYmxvY2tfYW5ubyg1OjUsICJlbXB0eTEiLCBncCA9IGdwYXIoZmlsbCA9ICJvcmNoaWQyIiksIGxhYmVsID0gIkNQRitUMytJT1AiKQ0KDQoNCmBgYA0KDQoNCg0KDQojIyMgQ29ycmVsYXRpb24gYmV0d2VlbiBzYW1wbGVzIChtb3N0IHZhcmlhYmxlIGdlbmVzKQ0KDQo8YnIvPg0KDQojIyMjIERlbmRvZ3JhbQ0KDQpgYGB7ciwgZmlnLndpZHRoPTIwLCBmaWcuaGVpZ2h0PTUsIGVjaG89RkFMU0V9DQojIERpc3NpbWlsYXJpdHkgbWF0cml4DQpkIDwtIGRpc3QodChjb3VudHNfVlNUX3RvcDIwMDApLCBtZXRob2QgPSAiZXVjbGlkZWFuIikNCg0KI2RvIG5vdCBwbG90IHRoaXMgb3IgY29tcHV0ZXIgd2lsbCBzdGFydCBvdmVyaGVhdGluZw0KI3Jlc3VsdCA8LSBwdmNsdXN0KHQodnN0X2NvdW50c190b3AxMDAwKSwgbWV0aG9kLmRpc3Q9ImV1Y2xpZGVhbiIsIG1ldGhvZC5oY2x1c3Q9IndhcmQuRDIiLCBuYm9vdD0xMDAwLCBwYXJhbGxlbD1UUlVFKQ0KI3Bsb3QocmVzdWx0KQ0KDQojIEhpZXJhcmNoaWNhbCBjbHVzdGVyaW5nIHVzaW5nIENvbXBsZXRlIExpbmthZ2UNCmhjMSA8LSBoY2x1c3QoZCwgbWV0aG9kID0gIndhcmQuRDIiICkNCg0KIyBQbG90IHRoZSBvYnRhaW5lZCBkZW5kcm9ncmFtDQojcGxvdChhcy5kZW5kcm9ncmFtKGhjMSksIHR5cGUgPSAicmVjdGFuZ2xlIiwgeWxhYiA9ICJIZWlnaHQiKQ0KDQojIHBsb3Qgd2l0aCBleHRlbmRlZCBncmFwaGljcw0KI2h0dHBzOi8vci1ncmFwaC1nYWxsZXJ5LmNvbS8zNDAtY3VzdG9tLXlvdXItZGVuZHJvZ3JhbS13aXRoLWRlbmRleHRlbmQuaHRtbA0KDQphcy5kZW5kcm9ncmFtKGhjMSkgJT4lIA0KICAjIEN1c3RvbSBicmFuY2hlcw0KICBzZXQoImJyYW5jaGVzX2NvbCIsICJncmF5OTAiKSAlPiUgc2V0KCJicmFuY2hlc19sd2QiLCAyKSAlPiUNCiAgIyBDdXN0b20gbGFiZWxzDQogIHNldCgibGFiZWxzX2NvbCIsICJncmF5NjAiKSAlPiUgc2V0KCJsYWJlbHNfY2V4IiwgMC42KSAlPiUNCiAgcGxvdCgpDQoNCmNvbG9yZWRfYmFycyhjb2xvcnMgPSBjYmluZChjb2xvcl9jYXRlZ29yaWNhbF9sYW5lLCBjb2xvcl9saXN0KSwgIyBjb2xvcnMgZm9yIGNhdGVnb3J5ICJleHBlcmltZW50Ig0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgIGRlbmQgPSBhcy5kZW5kcm9ncmFtKGhjMSksIA0KICAgICAgICAgICAgIHJvd0xhYmVscyA9IGMoImxhbmUiLCAidHJlYXRtZW50IiksICNmaXJzdCBjYXRlZ29yeSB0byBwbG90DQogICAgICAgICAgICB5X3NjYWxlCT0gMjAsDQogICAgICAgICAgICAgeV9zaGlmdAk9IC0xMDAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICApDQoNCg0KI3JlbW92ZSB1bnVzZWQgdmFyaWFibGVzDQojcm0oZCwgaGMxKQ0KDQpgYGANCg0KPGJyLz4NCg0KIyMjIyBDb3JyZWxhdGlvbiBtYXRyaXg6DQoNCmBgYHtyLCBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9MTAsIGVjaG89RkFMU0V9DQojIGNhbGN1bGF0ZSBjb3JyZWxhdGlvbiBiZXR3d2VuIHNhbXBsZXMNCiMgUk5BLVNlcSBzYW1wbGVzIGdlbmVyYWxseSBoYXZlIHZlcnkgaGlnaCBjb3JyZWxhdGlvbiAoUl4yID4gMC45KS4gUl4yIHZhbHVlcyBiZWxvdyAwLjggbWF5IGJlIGFuIGluZGljYXRpb24gb2YgYW4gb3V0bGllciBzYW1wbGUuIERlcGVuZGluZyBvbiBvdGhlciBRQyBtZXRyaWMsIHRoZXNlIGxvdyBjb3JyZWxhdGlvbiBzYW1wbGVzIG1heSBiZSBkaXNjYXJkZWQgZnJvbSBhbmFseXNlcy4NCmNvcnJlbGF0aW9uX21hdHJpeCA8LSBhcy5tYXRyaXgoY29yKGNvdW50c19WU1RfdG9wMjAwMCxtZXRob2Q9InNwZWFybWFuIikpDQoNCiMjZGVmaW5lIHRoZSBjb2xvcnMgZm9yIHRoZSBoZWF0bWFwIChjYXRlZ29yaWNhbCk6IDEgY29sb3IgZm9yIGVhY2ggc21hbGxlc3QgZXhwZXJpbWVudGFsIHVuaXQgdGhhdCBpcyBiZWluZyAgY29tcGFyZWQ7IGkuZS4gaGVyZSB0aGUgdHJlYXRtZW50DQpjb2xvcl9jYXRlZ29yaWNhbF9oZWF0bWFwIDwtIGNvbG9yX2NhdGVnb3JpY2FsX3RyZWF0bWVudA0KI25hbWUgdGhpcyBsaXN0IG9mIGNvbG9yIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgbmFtZXMgKG5vdGU6IHRoZXNlIGFyZSB0aGUgdW5pcXVlIHZhbHVlcyBmb3IgdGhhdCBjYXRlZ29yeSBpbiB0aGUgc2FtcGxlIG1ldGFkYXRhKQ0KY29sb3JfY2F0ZWdvcmljYWxfaGVhdG1hcF9uYW1lZCA8LSBjb2xvcl9jYXRlZ29yaWNhbF9oZWF0bWFwDQpuYW1lcyhjb2xvcl9jYXRlZ29yaWNhbF9oZWF0bWFwX25hbWVkKSA8LSB1bmlxdWUoc2FtcGxlX21ldGFkYXRhJHRyZWF0bWVudCkNCg0KI2xvYWQgdGhpcyBpbmZvcm1hdGlvbiBpbnRvIHRoZSBoZWF0bWFwDQpjb2xBbm4gPC0gSGVhdG1hcEFubm90YXRpb24oZGYgPSBkYXRhLmZyYW1lKHRyZWF0bWVudCA9IHNhbXBsZV9tZXRhZGF0YSR0cmVhdG1lbnQpLCAjdGhlIG5hbWUgb2YgdGhlIGNvbHVtbiBuZWVkcyB0byBtYXRjaCB0aGUgbmFtZSBvZiB0aGUgbmFtZWQgbGlzdA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbCA9IGxpc3QoInRyZWF0bWVudCIgPSBjb2xvcl9jYXRlZ29yaWNhbF9oZWF0bWFwX25hbWVkKSwgI3NldCB0aGUgbmFtZSBvZiB0aGUgbmFtZWQgbGlzdCBzbyBpdCBtYXRjaGVzDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgI2Fubm90YXRpb25fd2lkdGggPSB1bml0KGMoMSwgNCksICdjbScpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICNnYXAgPSB1bml0KDEsICdtbScpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd19sZWdlbmQgPSBGQUxTRSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG93X2Fubm90YXRpb25fbmFtZSA9IEZBTFNFLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoID0gJ2NvbCcNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjYWxzbyBjcmVhdGUgYW4gZW1wdHkgcm93IGFib2UgdGhlIGhlYXRtYXAsIHRvIGRpc3BsYXkgYWRkaXRpb25hbCBpbmZvDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgI2VtcHR5MSA9IGFubm9fZW1wdHkoYm9yZGVyID0gRkFMU0UsIGhlaWdodD0gdW5pdCg4LCAibW0iKSkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApDQoNCnJvd0FubiA8LSByb3dBbm5vdGF0aW9uKGRmID0gZGF0YS5mcmFtZSh0cmVhdG1lbnQgPSBzYW1wbGVfbWV0YWRhdGEkdHJlYXRtZW50KSwgI3RoZSBuYW1lIG9mIHRoZSBjb2x1bW4gbmVlZHMgdG8gbXV0Y2ggdGhlIG5hbWUgb2YgdGhlIG5hbWVkIGxpc3QNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2wgPSBsaXN0KCJ0cmVhdG1lbnQiID0gY29sb3JfY2F0ZWdvcmljYWxfaGVhdG1hcF9uYW1lZCksICNzZXQgdGhlIG5hbWUgb2YgdGhlIG5hbWVkIGxpc3Qgc28gaXQgbWF0Y2hlcw0KICAgICAgICAgICAgICAgICAgICAgICAgc2hvd19sZWdlbmQgPSBGQUxTRSwNCiAgICAgICAgICAgICAgICAgICAgICAgIHNob3dfYW5ub3RhdGlvbl9uYW1lID0gRkFMU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApDQoNCg0KSGVhdG1hcChtYXQgPSBjb3JyZWxhdGlvbl9tYXRyaXgsDQogICAgICAgIG5hbWU9ICJTcGVhcm1hbidzIHJobyIsDQogICAgICAgIGNvbHVtbl90aXRsZSA9IGd0X3JlbmRlcihwYXN0ZTAoIjxzcGFuIHN0eWxlPSdjb2xvcjpkYXJrb3JjaGlkNCc+KipTcGVhcm1hbidzICIsIGV4cHJlc3Npb24oz4EpLCAiKio8L3NwYW4+IGNvcnJlbGF0aW9uIGNvZWZmLiA8YnIvPiBiZXR3ZWVuIHNhbXBsZXMgPHNwYW4gc3R5bGU9J2NvbG9yOmdyYXk2MCc+KG9uIG1vc3QgdmFyaWFibGUgZ2VuZXMpPC9zcGFuPiIpKSwNCiAgICAgICAgY29sID0gYnJld2VyLnBhbCg5LCJCdVB1IiksDQogICAgICAgIG5hX2NvbCA9ICJibGFjayIsDQogICAgICAgIGNsdXN0ZXJfcm93cyA9IEZBTFNFLA0KICAgICAgICBzaG93X3Jvd19kZW5kID0gRkFMU0UsDQogICAgICAgICNyb3dfb3JkZXIgPSBvcmRlcmVkX2xldmVscywNCiAgICAgICAgY2x1c3Rlcl9jb2x1bW5zID0gRkFMU0UsDQogICAgICAgIHNob3dfY29sdW1uX2RlbmQgPSBGQUxTRSwNCiAgICAgICAgY2x1c3Rlcl9yb3dfc2xpY2VzID0gRkFMU0UsDQogICAgICAgIGNsdXN0ZXJfY29sdW1uX3NsaWNlcyA9IEZBTFNFLA0KICAgICAgICAjY29sdW1uX29yZGVyID0gb3JkZXJlZF9sZXZlbHMsDQogICAgICAgIHJvd19zcGxpdCA9IGZhY3RvcihzYW1wbGVfbWV0YWRhdGEkdHJlYXRtZW50LCBsZXZlbHMgPSBjKCJETVNPIiwgIlQzSU9QIiwgIk1QSSIsICJDUEYiLCAiQ1BGLlQzSU9QIikpLA0KICAgICAgICBjb2x1bW5fc3BsaXQgPSBmYWN0b3Ioc2FtcGxlX21ldGFkYXRhJHRyZWF0bWVudCwgbGV2ZWxzID0gYygiRE1TTyIsICJUM0lPUCIsICJNUEkiLCAiQ1BGIiwgIkNQRi5UM0lPUCIpKSwNCiAgICAgICAgI2NvbHVtbl9nYXAgPSB1bml0KGMocmVwKDEsOSksIHJlcCg4LDEpLCByZXAoMSw5KSwgcmVwKDgsMSksIHJlcCgxLDkpLCByZXAoOCwxKSwgcmVwKDEsOSksIHJlcCg4LDEpLCByZXAoMSw5KSksICJtbSIpLA0KICAgICAgIA0KICAgICAgICByb3dfdGl0bGUgPSBOVUxMLA0KICAgICAgICByb3dfZ2FwID0gdW5pdCgxLCAibW0iKSwNCiAgICAgICAgY29sdW1uX2dhcCA9IHVuaXQoMSwgIm1tIiksDQogICAgICAgIHdpZHRoID0gdW5pdCgxOCwgImNtIiksIA0KICAgICAgICBoZWlnaHQgPSB1bml0KDE4LCAiY20iKSwNCiAgICAgICAgY29sdW1uX25hbWVzX2dwID0gZ3JpZDo6Z3Bhcihmb250c2l6ZSA9IDgpLA0KICAgICAgICByb3dfbmFtZXNfZ3AgPSBncmlkOjpncGFyKGZvbnRzaXplID0gOCksDQogICAgICAgICN0b3BfYW5ub3RhdGlvbiA9IGNvbEFubiwNCiAgICAgICAgYm90dG9tX2Fubm90YXRpb24gPSBjb2xBbm4sDQogICAgICAgIHJpZ2h0X2Fubm90YXRpb24gPSByb3dBbm4sDQogICAgICAgIHNob3dfaGVhdG1hcF9sZWdlbmQgPSBUUlVFDQogICAgICAgICkNCg0KDQojbGlicmFyeShHZXRvcHRMb25nKSAgIyBmb3IgdGhlIGZ1bmN0aW9uIHFxKCkNCiNncm91cF9ibG9ja19hbm5vID0gZnVuY3Rpb24oZ3JvdXAsIGVtcHR5X2Fubm8sIGdwID0gZ3BhcigpLCANCiMgICAgbGFiZWwgPSBOVUxMLCBsYWJlbF9ncCA9IGdwYXIoKSkgew0KIw0KIyAgICBzZWVrVmlld3BvcnQocXEoImFubm90YXRpb25fQHtlbXB0eV9hbm5vfV9Ae21pbihncm91cCl9IikpDQojICAgIGxvYzEgPSBkZXZpY2VMb2MoeCA9IHVuaXQoMCwgIm5wYyIpLCB5ID0gdW5pdCgwLCAibnBjIikpDQojICAgIHNlZWtWaWV3cG9ydChxcSgiYW5ub3RhdGlvbl9Ae2VtcHR5X2Fubm99X0B7bWF4KGdyb3VwKX0iKSkNCiMgICAgbG9jMiA9IGRldmljZUxvYyh4ID0gdW5pdCgxLCAibnBjIiksIHkgPSB1bml0KDEsICJucGMiKSkNCiMNCiMgICAgc2Vla1ZpZXdwb3J0KCJnbG9iYWwiKQ0KIyAgICBncmlkLnJlY3QobG9jMSR4LCBsb2MxJHksIHdpZHRoID0gbG9jMiR4IC0gbG9jMSR4LCBoZWlnaHQgPSBsb2MyJHkgLSBsb2MxJHksIA0KIyAgICAgICAganVzdCA9IGMoImxlZnQiLCAiYm90dG9tIiksIGdwID0gZ3ApDQojICAgIGlmKCFpcy5udWxsKGxhYmVsKSkgew0KIyAgICAgICAgZ3JpZC50ZXh0KGxhYmVsLCB4ID0gKGxvYzEkeCArIGxvYzIkeCkqMC41LCB5ID0gKGxvYzEkeSArIGxvYzIkeSkqMC41LCBncCA9IGxhYmVsX2dwKQ0KIyAgICB9DQojfQ0KDQojZ3JvdXBfYmxvY2tfYW5ubygxOjEwLCAiZW1wdHkxIiwgZ3AgPSBncGFyKGZpbGwgPSAiZ3JheTcwIiksIGxhYmVsID0gIkRNU08iKQ0KI2dyb3VwX2Jsb2NrX2Fubm8oMTE6MjAsICJlbXB0eTEiLCBncCA9IGdwYXIoZmlsbCA9ICJwYWxlZ3JlZW4zIiksIGxhYmVsID0gIlQzK0lPUCIpDQojZ3JvdXBfYmxvY2tfYW5ubygyMTozMCwgImVtcHR5MSIsIGdwID0gZ3BhcihmaWxsID0gImxpZ2h0Y29yYWwiKSwgbGFiZWwgPSAiTVBJIikNCiNncm91cF9ibG9ja19hbm5vKDMxOjQwLCAiZW1wdHkxIiwgZ3AgPSBncGFyKGZpbGwgPSAibGlnaHRza3libHVlIiksIGxhYmVsID0gIkNQRiIpDQojZ3JvdXBfYmxvY2tfYW5ubyg0MTo1MCwgImVtcHR5MSIsIGdwID0gZ3BhcihmaWxsID0gIm9yY2hpZDIiKSwgbGFiZWwgPSAiQ1BGK1QzK0lPUCIpDQoNCg0KYGBgDQoNCiMjIyBQQ0EgcGxvdHMNCg0KIyMjIyB7LnRhYnNldH0NCiMjIyMjIFBDQSBwbG90cw0KV2UgY2FuIHJ1biB0aGUgUENBIGJhc2VkIG9uIHRoZSB0b3AgdmFyaWFibGUgZ2VuZXMuIEJlbG93LCB0aGUgc2NyZWUgcGxvdCBpbmRpY2F0aW5nIHRoZSBjb250cmlidXRpb24gb2YgZWFjaCBQcmluY2lwYWwgQ29tcG9uZW50LCBhbmQgdGhlIHBsb3Qgb2YgdGhlIFBDQSBvdmVyIHRoZSB0b3AxMCBjb21wb25lbnRzLiANCg0KDQpgYGB7ciwgZmlnLndpZHRoPSA2LCBmaWcuaGVpZ2h0PTQsIGVjaG89RkFMU0V9DQojIyBGb3IgUENBIHdlIG5lZWQgdG8gc3RhcnQgd2l0aCB0aGUgZGF0YSBpbiB0aGUgY29ycmVjdCBmb3JtYXQgKHdlIG5lZWQgY29uZGl0aW9ucyBhcyByb3csIGFuZCBnZW5lcyBhcyBjb2x1bW5zKQ0KIyB0cmFuc3Bvc2Ugb3VyIGNvdW50cyBtYXRyaXggKHN3aXRjaCByb3dzIGFuZCBjb2x1bW5zKQ0KY291bnRzX1ZTVF90b3AyMDAwX3RyYW5zcG9zZWQgPC0gdChjb3VudHNfVlNUX3RvcDIwMDApDQoNCg0KI3dlIHdpbGwgY2hhbmdlIGdlbmUgc3ltYm9scyB3aXRoIHRoZWlyIGRlc2NyaXB0aW9uLCBidXQgbWFueSBnZW5lcyBoYXZlIGVtcHR5IHZhbHVlcy4gV2hlcmUgZW1wdHksIHdlIHdpbGwgbm93IHJlcGxhY2Ugd2l0aCB0aGUgZ2VuZSBzeW1ib2wNCiNhbm5vdGF0aW9uX2luZm8kZGVzY3JpcHRpb24gPSBjb2FsZXNjZShhbm5vdGF0aW9uX2luZm8kZGVzY3JpcHRpb24sICN3aGVuIG5vdCBOQQ0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25faW5mbyRzeW1ib2wpICN3aGVuIE5BDQoNCiNzYXZlIHRoZSBvcmlnaW5hbCBjb2xfbmFtZXMgKGVudHJlel9JRCkNCm9sZF9jb2xuYW1lcyA8LSBjb2xuYW1lcyhjb3VudHNfVlNUX3RvcDIwMDBfdHJhbnNwb3NlZCkNCg0KIyBQbGFjZSB0aGUgZ2VuZSBkZXNjcmlwdGlvbiAoaXMgYWxyZWFkeSB1bmlxdWUgZnJvbSBob3cgd2UgY29uc3RydWN0ZWQgdGhlIGFubm90YXRpb24gdGFibGUpDQojY29sbmFtZXMoY291bnRzX1ZTVF90b3AyMDAwX3RyYW5zcG9zZWQpIDwtIGRwbHlyOjpyZWNvZGUoDQojICBjb2xuYW1lcyhjb3VudHNfVlNUX3RvcDIwMDBfdHJhbnNwb3NlZCksIA0KIyAgISEhc2V0TmFtZXMoYXMuY2hhcmFjdGVyKGFubm90YXRpb25faW5mbyRtZXJnZWRfZGVzY3JpcHRpb24pLCAjIGNvbHVtbiBvZiBkaWN0aW9uYXJ5IHRhYmxlIHRoYXQgaGFzIE5FVyBuYW1lcyANCiMgICAgICAgICAgICAgIGFubm90YXRpb25faW5mbyRlbnRyZXpfSUQpICAjY29sdW1uIG9mIGRpY3Rpb25hcnkgdGFibGUgd2l0aCBPTEQgbmFtZXMNCiMgICkNCmNvbG5hbWVzKGNvdW50c19WU1RfdG9wMjAwMF90cmFuc3Bvc2VkKSA8LSBhbm5vdGF0aW9uX2luZm8kbWVyZ2VkX2Rlc2NyaXB0aW9uW21hdGNoKGNvbG5hbWVzKGNvdW50c19WU1RfdG9wMjAwMF90cmFuc3Bvc2VkKSwgYW5ub3RhdGlvbl9pbmZvJGVudHJlel9JRCldDQoNCiNzYXZlIHRoZSBuZXcgY29sX25hbWVzIChndWxsIGdlbmUgZGVzY3JpcHRpb24sIG1hZGUgdW5pcXVlIHdpdGggcG9zdHNjcmlwdHMpDQpuZXdfY29sbmFtZXMgPC0gY29sbmFtZXMoY291bnRzX1ZTVF90b3AyMDAwX3RyYW5zcG9zZWQpDQojYWxsb3dpbmcgdXMgdG8gY3JlYXRlIGEgbmFtZSBjb252ZXJzaW9uIGRpY3Rpb25hcnkgZm9yIGxhdGVyIHN0ZXBzIHVzaW5nIHRoaXMgUENBIG9iamVjdA0KZW50cmV6aWQybmFtZV9jb252ZXJ0ZXIgPC0gZGF0YS5mcmFtZShlbnRyZXpfSUQgPSBvbGRfY29sbmFtZXMsIHVuaXF1ZV9kZXNjcmlwdGlvbiA9IG5ld19jb2xuYW1lcykNCg0KDQojd2UgY2FuIG5vdyBjYWxjdWxhdGUgUENBIChvbiB0aGUgdG9wIDIwMDAgZ2VuZXMpDQpQQ0FvYmplY3RfdG9wMjAwMCA8LSBwcmNvbXAoeD1jb3VudHNfVlNUX3RvcDIwMDBfdHJhbnNwb3NlZCwgY2VudGVyID0gVCwgc2NhbGUuID0gRikNCg0KIyBQbG90IFNjcmVlIFBsb3Qgb2Ygb3VyIGRhdGENCmJhcnBsb3QoI3JvdW5kKFBDQW9iamVjdF90b3AyMDAwJHNkZXZeMi9zdW0oUENBb2JqZWN0X3RvcDIwMDAkc2Rldl4yKSoxMDAsMiksDQogIHJvdW5kKFBDQW9iamVjdF90b3AyMDAwJHNkZXZeMi9zdW0oUENBb2JqZWN0X3RvcDIwMDAkc2Rldl4yKSoxMDAsMilbcm91bmQoUENBb2JqZWN0X3RvcDIwMDAkc2Rldl4yL3N1bShQQ0FvYmplY3RfdG9wMjAwMCRzZGV2XjIpKjEwMCwyKSA+IDEwMC9sZW5ndGgoY29sbmFtZXMoUENBb2JqZWN0X3RvcDIwMDAkeCkpXSwNCiAgICAgICAgIGxhcz0yLA0KICAgICAgICAgbmFtZXMuYXJnPWNvbG5hbWVzKFBDQW9iamVjdF90b3AyMDAwJHgpW3JvdW5kKFBDQW9iamVjdF90b3AyMDAwJHNkZXZeMi9zdW0oUENBb2JqZWN0X3RvcDIwMDAkc2Rldl4yKSoxMDAsMikgPiAxMDAvbGVuZ3RoKGNvbG5hbWVzKFBDQW9iamVjdF90b3AyMDAwJHgpKV0sDQogICAgICAgICB5bGFiPSIlIFZhcmlhbmNlIGV4cGxhaW5lZCIsDQogICAgICAgICB4bGFiPSJQQ0EgcHJpbmNpcGFsIGNvbXBvbmVudHMiLA0KICAgICAgICAgeWxpbSA9cmFuZ2UocHJldHR5KGMoMCwgMTAwKSkpLA0KICAgICAgICAgbWFpbiA9ICJTY3JlZSBwbG90ICh0b3AgdmFyaWFudCBnZW5lcykgXG4gKG9ubHkgc2hvd2luZyBtYWluIFBDcykiDQogICAgICAgICApDQphYmxpbmUoaD0xMDAvbGVuZ3RoKGNvbG5hbWVzKFBDQW9iamVjdF90b3AyMDAwJHgpKSwgbHR5PTIsIGNvbD0iZG9kZ2VyYmx1ZSIpDQoNCg0KI3JlbW92ZSB1bnVzZWQgdmFyaWFibGVzDQpybShuZXdfY29sbmFtZXMsIG9sZF9jb2xuYW1lcykNCmBgYA0KDQo8YnIgLz4NCg0KKiBfX1N0ZXAgMTpfXyBCZWxvdywgYW4gZXhwbG9yYXRvcnkgb3ZlcnZpZXcgb2YgdGhlIGRpc3RyaWJ1dGlvbiBvZiBzYW1wbGVzIGFjcm9zcyB0aGUgbWFpbiBQQ3MsIGhpZ2hsaWdodGluZyB0cmVhdG1lbnQgY29uZGl0aW9ucywgYXMgd2VsbCBhcyBvdGhlciBrbm93biBwb3NzaWJsZSBzb3VyY2VzIG9mIHZhcmlhdGlvbiAoaGVyZTogdGVjaG5pY2FsIHJlcGxpY2F0ZXM6IGRpZmZlcmVudCBsYW5lcykNCg0KYGBge3IsIGZpZy53aWR0aD0gMTAsIGZpZy5oZWlnaHQ9MjAsIGVjaG89RkFMU0V9DQojIyBQQ0EgKHNlZ21lbnQgY29sb3VyIGNvZGUpDQoNCiMgd2Ugd2lsbCB1c2UgZ2dwbG90LCBzbyB3ZSBuZWVkIHRvIGFkZCBhIGNvbHVtbiB3aXRoIHRoZSBzYW1wbGUgbmFtZXMgdG8gb3VyIGRhdGENClBDQW9iamVjdF90b3AyMDAwX2dncGxvdCA8LSBtZXJnZShhcy5kYXRhLmZyYW1lKFBDQW9iamVjdF90b3AyMDAwJHgpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZV9tZXRhZGF0YSwgI3dlIGFyZSBtZXJnaW5nIHdpdGggYSBkYXRhZnJhbWUgdGhhdCBoYXMgYSBjb2x1bW4gInN0YWdlIiBmb3IgZWFjaCBzYW1wbGUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieT0wKQ0KDQpQQ0FvYmplY3RfdG9wMjAwMF9nZ3Bsb3QkdHJlYXRtZW50ICA8LSBmYWN0b3IoUENBb2JqZWN0X3RvcDIwMDBfZ2dwbG90JHRyZWF0bWVudCxsZXZlbHMgPSBjKCJETVNPIiwgIlQzSU9QIiwgIk1QSSIsICJDUEYiLCAiQ1BGLlQzSU9QIikpDQoNCg0KDQpwbG90MWEgPC0gZ2dwbG90KFBDQW9iamVjdF90b3AyMDAwX2dncGxvdCwNCiAgICAgICBhZXMoUEMxLFBDMixjb2xvdXI9IHRyZWF0bWVudCwgc2hhcGU9bGFuZSkpKw0KICBnZW9tX3BvaW50KHNpemU9MykrDQogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjb2xvcl9jYXRlZ29yaWNhbF90cmVhdG1lbnQpKw0KICBzY2FsZV9zaGFwZV9tYW51YWwodmFsdWVzID0gYygxNiwxKSkrIA0KICMgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gY29sb3JfY2F0ZWdvcmljYWxfc3RhZ2UpKw0KICAjeGxpbSgtNTUsIDU1KSsNCiAgI3lsaW0oLTU1LCA1NSkrDQogIHhsYWIocGFzdGUoIlBDMSAoIiwgcm91bmQoc3VtbWFyeShQQ0FvYmplY3RfdG9wMjAwMCkkaW1wb3J0YW5jZVsyXSoxMDAsMiksICIlKSIpKSArIA0KICB5bGFiKHBhc3RlKCJQQzIgKCIsIHJvdW5kKHN1bW1hcnkoUENBb2JqZWN0X3RvcDIwMDApJGltcG9ydGFuY2VbNV0qMTAwLDIpLCAiJSkiKSkrDQogIHRoZW1lX2NsYXNzaWMoKSsgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJsZWZ0IikNCg0KcGxvdDFiIDwtIGdncGxvdChQQ0FvYmplY3RfdG9wMjAwMF9nZ3Bsb3QsDQogICAgICAgYWVzKFBDMSxQQzIsY29sb3VyPSBsYW5lLCBzaGFwZT1sYW5lKSkrDQogIGdlb21fcG9pbnQoc2l6ZT0zKSsNCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGNvbG9yX2NhdGVnb3JpY2FsX2xhbmUpKw0KICBzY2FsZV9zaGFwZV9tYW51YWwodmFsdWVzID0gYygxNiwxKSkrIA0KICMgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gY29sb3JfY2F0ZWdvcmljYWxfc3RhZ2UpKw0KICAjeGxpbSgtNTUsIDU1KSsNCiAgI3lsaW0oLTU1LCA1NSkrDQogIHhsYWIocGFzdGUoIlBDMSAoIiwgcm91bmQoc3VtbWFyeShQQ0FvYmplY3RfdG9wMjAwMCkkaW1wb3J0YW5jZVsyXSoxMDAsMiksICIlKSIpKSArIA0KICB5bGFiKHBhc3RlKCJQQzIgKCIsIHJvdW5kKHN1bW1hcnkoUENBb2JqZWN0X3RvcDIwMDApJGltcG9ydGFuY2VbNV0qMTAwLDIpLCAiJSkiKSkrDQogIHRoZW1lX2NsYXNzaWMoKSsgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJub25lIikNCg0KDQoNCiMtLS0tLS0tLS0tLS0tLS0tDQoNCnBsb3QyYSA8LSBnZ3Bsb3QoUENBb2JqZWN0X3RvcDIwMDBfZ2dwbG90LA0KICAgICAgIGFlcyhQQzMsUEMyLGNvbG91cj0gdHJlYXRtZW50LCBzaGFwZT1sYW5lKSkrDQogIGdlb21fcG9pbnQoc2l6ZT0zKSsNCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGNvbG9yX2NhdGVnb3JpY2FsX3RyZWF0bWVudCkrDQogIHNjYWxlX3NoYXBlX21hbnVhbCh2YWx1ZXMgPSBjKDE2LDEpKSsgDQogICNzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjb2xvcl9jYXRlZ29yaWNhbF9zdGFnZSkrDQogICN4bGltKC01NSwgNTUpKw0KICAjeWxpbSgtNTUsIDU1KSsNCiAgeGxhYihwYXN0ZSgiUEMzICgiLCByb3VuZChzdW1tYXJ5KFBDQW9iamVjdF90b3AyMDAwKSRpbXBvcnRhbmNlWzhdKjEwMCwyKSwgIiUpIikpICsgDQogIHlsYWIocGFzdGUoIlBDMiAoIiwgcm91bmQoc3VtbWFyeShQQ0FvYmplY3RfdG9wMjAwMCkkaW1wb3J0YW5jZVs1XSoxMDAsMiksICIlKSIpKSsNCiAgdGhlbWVfY2xhc3NpYygpKyB0aGVtZShsZWdlbmQucG9zaXRpb249Im5vbmUiKQ0KDQpwbG90MmIgPC0gZ2dwbG90KFBDQW9iamVjdF90b3AyMDAwX2dncGxvdCwNCiAgICAgICBhZXMoUEMzLFBDMixjb2xvdXI9IGxhbmUsIHNoYXBlPWxhbmUpKSsNCiAgZ2VvbV9wb2ludChzaXplPTMpKw0KICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gY29sb3JfY2F0ZWdvcmljYWxfbGFuZSkrDQogIHNjYWxlX3NoYXBlX21hbnVhbCh2YWx1ZXMgPSBjKDE2LDEpKSsgDQogICNzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjb2xvcl9jYXRlZ29yaWNhbF9zdGFnZSkrDQogICN4bGltKC01NSwgNTUpKw0KICAjeWxpbSgtNTUsIDU1KSsNCiAgeGxhYihwYXN0ZSgiUEMzICgiLCByb3VuZChzdW1tYXJ5KFBDQW9iamVjdF90b3AyMDAwKSRpbXBvcnRhbmNlWzhdKjEwMCwyKSwgIiUpIikpICsgDQogIHlsYWIocGFzdGUoIlBDMiAoIiwgcm91bmQoc3VtbWFyeShQQ0FvYmplY3RfdG9wMjAwMCkkaW1wb3J0YW5jZVs1XSoxMDAsMiksICIlKSIpKSsNCiAgdGhlbWVfY2xhc3NpYygpKyB0aGVtZShsZWdlbmQucG9zaXRpb249Im5vbmUiKQ0KDQoNCiMtLS0tLS0tLS0tLS0tLS0tDQoNCnBsb3QzYSA8LSBnZ3Bsb3QoUENBb2JqZWN0X3RvcDIwMDBfZ2dwbG90LA0KICAgICAgIGFlcyhQQzMsUEM0LGNvbG91cj0gdHJlYXRtZW50LCBzaGFwZT1sYW5lKSkrDQogIGdlb21fcG9pbnQoc2l6ZT0zKSsNCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGNvbG9yX2NhdGVnb3JpY2FsX3RyZWF0bWVudCkrDQogIHNjYWxlX3NoYXBlX21hbnVhbCh2YWx1ZXMgPSBjKDE2LDEpKSsgDQogICNzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjb2xvcl9jYXRlZ29yaWNhbF9zdGFnZSkrDQogICN4bGltKC01NSwgNTUpKw0KICAjeWxpbSgtNTUsIDU1KSsNCiAgdGhlbWVfY2xhc3NpYygpKyB0aGVtZShsZWdlbmQucG9zaXRpb249Im5vbmUiKQ0KDQpwbG90M2IgPC0gZ2dwbG90KFBDQW9iamVjdF90b3AyMDAwX2dncGxvdCwNCiAgICAgICBhZXMoUEMzLFBDNCxjb2xvdXI9IGxhbmUsIHNoYXBlPWxhbmUpKSsNCiAgZ2VvbV9wb2ludChzaXplPTMpKw0KICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gY29sb3JfY2F0ZWdvcmljYWxfbGFuZSkrDQogICNzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gcmVwKCJncmF5MzAiLCAzKSkrDQogIHNjYWxlX3NoYXBlX21hbnVhbCh2YWx1ZXMgPSBjKDE2LDEpKSsNCiAgI3NjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGNvbG9yX2NhdGVnb3JpY2FsX3N0YWdlKSsNCiAgI3hsaW0oLTU1LCA1NSkrDQogICN5bGltKC01NSwgNTUpKw0KICB0aGVtZV9jbGFzc2ljKCkrIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpDQoNCg0KIy0tLS0tLS0tLS0tLS0tLS0NCg0KcGxvdDRhIDwtIGdncGxvdChQQ0FvYmplY3RfdG9wMjAwMF9nZ3Bsb3QsDQogICAgICAgYWVzKFBDNSxQQzQsY29sb3VyPSB0cmVhdG1lbnQsIHNoYXBlPWxhbmUpKSsNCiAgZ2VvbV9wb2ludChzaXplPTMpKw0KICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gY29sb3JfY2F0ZWdvcmljYWxfdHJlYXRtZW50KSsNCiAgc2NhbGVfc2hhcGVfbWFudWFsKHZhbHVlcyA9IGMoMTYsMSkpKw0KICAjc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gY29sb3JfY2F0ZWdvcmljYWxfc3RhZ2UpKw0KICAjeGxpbSgtNTUsIDU1KSsNCiAgI3lsaW0oLTU1LCA1NSkrDQogIHRoZW1lX2NsYXNzaWMoKSsgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJub25lIikNCg0KcGxvdDRiIDwtIGdncGxvdChQQ0FvYmplY3RfdG9wMjAwMF9nZ3Bsb3QsDQogICAgICAgYWVzKFBDNSxQQzQsY29sb3VyPSBsYW5lLCBzaGFwZT1sYW5lKSkrDQogIGdlb21fcG9pbnQoc2l6ZT0zKSsNCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGNvbG9yX2NhdGVnb3JpY2FsX2xhbmUpKw0KICAjc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IHJlcCgiZ3JheTMwIiwgMykpKw0KICBzY2FsZV9zaGFwZV9tYW51YWwodmFsdWVzID0gYygxNiwxKSkrDQogICNzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjb2xvcl9jYXRlZ29yaWNhbF9zdGFnZSkrDQogICN4bGltKC01NSwgNTUpKw0KICAjeWxpbSgtNTUsIDU1KSsNCiAgdGhlbWVfY2xhc3NpYygpKyB0aGVtZShsZWdlbmQucG9zaXRpb249Im5vbmUiKQ0KDQoNCg0KIy0tLS0tLS0tLS0tLS0tLS0NCg0KcGxvdDVhIDwtIGdncGxvdChQQ0FvYmplY3RfdG9wMjAwMF9nZ3Bsb3QsDQogICAgICAgYWVzKFBDNSxQQzYsY29sb3VyPSB0cmVhdG1lbnQsIHNoYXBlPWxhbmUpKSsNCiAgZ2VvbV9wb2ludChzaXplPTMpKw0KICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gY29sb3JfY2F0ZWdvcmljYWxfdHJlYXRtZW50KSsNCiAgc2NhbGVfc2hhcGVfbWFudWFsKHZhbHVlcyA9IGMoMTYsMSkpKyANCiAgI3NjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGNvbG9yX2NhdGVnb3JpY2FsX3N0YWdlKSsNCiAgI3hsaW0oLTU1LCA1NSkrDQogICN5bGltKC01NSwgNTUpKw0KICB0aGVtZV9jbGFzc2ljKCkrIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpDQoNCnBsb3Q1YiA8LSBnZ3Bsb3QoUENBb2JqZWN0X3RvcDIwMDBfZ2dwbG90LA0KICAgICAgIGFlcyhQQzUsUEM2LGNvbG91cj0gbGFuZSwgc2hhcGU9bGFuZSkpKw0KICBnZW9tX3BvaW50KHNpemU9MykrDQogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjb2xvcl9jYXRlZ29yaWNhbF9sYW5lKSsNCiAgI3NjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSByZXAoImdyYXkzMCIsIDMpKSsNCiAgc2NhbGVfc2hhcGVfbWFudWFsKHZhbHVlcyA9IGMoMTYsMSkpKw0KICAjc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gY29sb3JfY2F0ZWdvcmljYWxfc3RhZ2UpKw0KICAjeGxpbSgtNTUsIDU1KSsNCiAgI3lsaW0oLTU1LCA1NSkrDQogIHRoZW1lX2NsYXNzaWMoKSsgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJub25lIikNCg0KDQoNCiMtLS0tLS0tLS0tLS0tLS0tDQoNCnBsb3Q2YSA8LSBnZ3Bsb3QoUENBb2JqZWN0X3RvcDIwMDBfZ2dwbG90LA0KICAgICAgIGFlcyhQQzYsUEM3LGNvbG91cj0gdHJlYXRtZW50LCBzaGFwZT1sYW5lKSkrDQogIGdlb21fcG9pbnQoc2l6ZT0zKSsNCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGNvbG9yX2NhdGVnb3JpY2FsX3RyZWF0bWVudCkrDQogIHNjYWxlX3NoYXBlX21hbnVhbCh2YWx1ZXMgPSBjKDE2LDEpKSsNCiAgI3NjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGNvbG9yX2NhdGVnb3JpY2FsX3N0YWdlKSsNCiAgI3hsaW0oLTU1LCA1NSkrDQogICN5bGltKC01NSwgNTUpKw0KICB0aGVtZV9jbGFzc2ljKCkNCg0KcGxvdDZiIDwtIGdncGxvdChQQ0FvYmplY3RfdG9wMjAwMF9nZ3Bsb3QsDQogICAgICAgYWVzKFBDNixQQzcsY29sb3VyPSBsYW5lLCBzaGFwZT1sYW5lKSkrDQogIGdlb21fcG9pbnQoc2l6ZT0zKSsNCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGNvbG9yX2NhdGVnb3JpY2FsX2xhbmUpKw0KICAjc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IHJlcCgiZ3JheTMwIiwgMykpKw0KIHNjYWxlX3NoYXBlX21hbnVhbCh2YWx1ZXMgPSBjKDE2LDEpKSsNCiAgI3NjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGNvbG9yX2NhdGVnb3JpY2FsX3N0YWdlKSsNCiAgI3hsaW0oLTU1LCA1NSkrDQogICN5bGltKC01NSwgNTUpKw0KICB0aGVtZV9jbGFzc2ljKCkNCg0KDQoNCmdyaWQuYXJyYW5nZShwbG90MWEscGxvdDFiLA0KICAgICAgICAgICAgIHBsb3QyYSxwbG90MmIsDQogICAgICAgICAgICAgcGxvdDNhLHBsb3QzYiwNCiAgICAgICAgICAgICBwbG90NGEscGxvdDRiLA0KICAgICAgICAgICAgIHBsb3Q1YSxwbG90NWIsDQogICAgICAgICAgICAgcGxvdDZhLHBsb3Q2YiwgbmNvbD0yLCBucm93PTYpDQoNCiNyZW1vdmUgdW51c2VkIHZhcmlhYmxlcw0KI3JtKHBsb3QxLCBwbG90MiwgcGxvdDMsIHBsb3Q0LCBwbG90NSwgcGxvdDYpDQoNCmBgYA0KDQo8YnIgLz4NCiogX19TdGVwIDI6X18gVGhlIHNjcmVlIHBsb3Qgc2hvd3MgdGhhdCBtb3N0IG9mIHRoZSB2YXJpYW5jZSBwcmVzZW50IGluIHRoZSBkYXRhc2V0IGNhbiBiZSByZXByZXNlbnRlZCBpbiB0d28gZGltZW5zaW9ucy4gQmVsb3cgaXMgdGhlIFBDMSB2cyBQQzIgc3VtbWFyeSBwbG90LCBjb2xvdXJlZCBieSBjb25kaXRpb24sIHdpdGggYW5kIHdpdGhvdXQgbGFiZWxzIHRvIGNvcnJlbGF0ZSBwb2ludHMgdG8gdGhlIGFjdHVhbCBsYXJ2YWwgc2FtcGxlcyAob2Ygd2hpY2ggd2UgaGF2ZSBwaWN0dXJlcykNCg0KYGBge3IsIGVjaG89RkFMU0UsIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD01fQ0KI2xldCB1cyBhbHNvIGp1c3QgcGxvdCB0aGUgZmlyc3QgUENBIHBsb3QNCmdncGxvdChQQ0FvYmplY3RfdG9wMjAwMF9nZ3Bsb3QsDQogICAgICAgYWVzKFBDMSxQQzIsY29sb3VyPSB0cmVhdG1lbnQsIHNoYXBlPWxhbmUpKSsNCiAgZ2VvbV9wb2ludChzaXplPTMpKw0KICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gY29sb3JfY2F0ZWdvcmljYWxfdHJlYXRtZW50KSsNCiAgc2NhbGVfc2hhcGVfbWFudWFsKHZhbHVlcyA9IGMoMTYsMSkpKyANCiAgZ2VvbV9sYWJlbF9yZXBlbChkYXRhID0gUENBb2JqZWN0X3RvcDIwMDBfZ2dwbG90W3NlcShmcm9tPTIxLCB0byA9NDAsIGJ5PTIpLF0sDQogICAgICAgICAgICAgICAgICAgYWVzKHg9UEMxLCB5PSBQQzIsIGNvbG91cj0gdHJlYXRtZW50LCBsYWJlbD1Sb3cubmFtZXMpLA0KICAgICAgICAgICAgICAgICAgIHNpemUgPSAzLCBzaG93LmxlZ2VuZCA9IEZBTFNFLA0KICAgICAgICAgICAgICAgICAgIGZpbGwgPSAid2hpdGUiLA0KICAgICAgICAgICAgICAgICAgIG1heC5vdmVybGFwcz0gNTAsDQogICAgICAgICAgICAgICAgICAgI3hsaW0gPSBjKC1JbmYsIEluZikNCiAgICAgICAgICAgICAgICAgICApICsgDQogIyBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjb2xvcl9jYXRlZ29yaWNhbF9zdGFnZSkrDQogICN4bGltKC01NSwgNTUpKw0KICAjeWxpbSgtNTUsIDU1KSsNCiAgeGxhYihwYXN0ZSgiUEMxICgiLCByb3VuZChzdW1tYXJ5KFBDQW9iamVjdF90b3AyMDAwKSRpbXBvcnRhbmNlWzJdKjEwMCwyKSwgIiUpIikpICsgDQogIHlsYWIocGFzdGUoIlBDMiAoIiwgcm91bmQoc3VtbWFyeShQQ0FvYmplY3RfdG9wMjAwMCkkaW1wb3J0YW5jZVs1XSoxMDAsMiksICIlKSIpKSsNCiAgdGhlbWVfY2xhc3NpYygpKyB0aGVtZShsZWdlbmQucG9zaXRpb249ImxlZnQiKQ0KDQoNCg0KI3dpdGhvdXQgbGFiZWxzDQpnZ3Bsb3QoUENBb2JqZWN0X3RvcDIwMDBfZ2dwbG90LA0KICAgICAgIGFlcyhQQzEsUEMyLGNvbG91cj0gdHJlYXRtZW50LCBzaGFwZT1sYW5lKSkrDQogIGdlb21fcG9pbnQoc2l6ZT01KSsNCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGNvbG9yX2NhdGVnb3JpY2FsX3RyZWF0bWVudCkrDQogIHNjYWxlX3NoYXBlX21hbnVhbCgidGVjaG5pY2FsIHJlcGxpY2F0ZSIsIHZhbHVlcyA9IGMoMTYsMSkpKyANCiAgI2dlb21fbGFiZWxfcmVwZWwoZGF0YSA9IFBDQW9iamVjdF90b3AyMDAwX2dncGxvdFtzZXEoZnJvbT0yMSwgdG8gPTQwLCBieT0yKSxdLA0KICAjICAgICAgICAgICAgICAgICBhZXMoeD1QQzEsIHk9IFBDMiwgY29sb3VyPSB0cmVhdG1lbnQsIGxhYmVsPVJvdy5uYW1lcyksDQogICMgICAgICAgICAgICAgICAgIHNpemUgPSAzLCBzaG93LmxlZ2VuZCA9IEZBTFNFLA0KICAjICAgICAgICAgICAgICAgICBmaWxsID0gIndoaXRlIiwNCiAgIyAgICAgICAgICAgICAgICAgbWF4Lm92ZXJsYXBzPSA1MCwNCiAgIyAgICAgICAgICAgICAgICAgI3hsaW0gPSBjKC1JbmYsIEluZikNCiAgIyAgICAgICAgICAgICAgICAgKSArIA0KICMgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gY29sb3JfY2F0ZWdvcmljYWxfc3RhZ2UpKw0KICAjeGxpbSgtNTUsIDU1KSsNCiAgI3lsaW0oLTU1LCA1NSkrDQogIHhsYWIocGFzdGUoIlBDMSAoIiwgcm91bmQoc3VtbWFyeShQQ0FvYmplY3RfdG9wMjAwMCkkaW1wb3J0YW5jZVsyXSoxMDAsMiksICIlKSIpKSArIA0KICB5bGFiKHBhc3RlKCJQQzIgKCIsIHJvdW5kKHN1bW1hcnkoUENBb2JqZWN0X3RvcDIwMDApJGltcG9ydGFuY2VbNV0qMTAwLDIpLCAiJSkiKSkrDQogIHRoZW1lX2NsYXNzaWMoKSsgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJyaWdodCIpDQpgYGANCg0KPGJyIC8+DQoqIF9fU3RlcCAzOl9fIFdpdGggYWRkZWQgcG9seWdvbnMgdG8gaGlnaGxpZ2h0IHRoZSBzcHJlYWQgb2Ygc2FtcGxlcyB3aXRoaW4gZWFjaCBjb25kaXRpb24gKHRoaXMgaXMgdGhlIGZpbmFsIGZpZ3VyZSByZXBvcnRlZCBpbiB0aGUgcGFwZXIpDQoNCmBgYHtyLCBlY2hvPUZBTFNFLCBmaWcud2lkdGg9OCwgZmlnLmhlaWdodD01fQ0KDQoNCiN3aXRoIHBvbHlnb24NCmdncGxvdChQQ0FvYmplY3RfdG9wMjAwMF9nZ3Bsb3QsDQogICAgICAgYWVzKFBDMSxQQzIsY29sb3VyPSB0cmVhdG1lbnQsIHNoYXBlPWxhbmUpKSsNCiAgZ2VvbV9lbmNpcmNsZShhZXMoZmlsbCA9IHRyZWF0bWVudCksIGFscGhhID0gMC4wNywgc2hvdy5sZWdlbmQgPSBGLCBzX3NoYXBlPTAuOCwgZXhwYW5kID0gMC4wNSkrDQogIGdlb21fcG9pbnQoc2l6ZT01KSsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gY29sb3JfY2F0ZWdvcmljYWxfdHJlYXRtZW50KSsNCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGNvbG9yX2NhdGVnb3JpY2FsX3RyZWF0bWVudCkrDQogIHNjYWxlX3NoYXBlX21hbnVhbCgidGVjaG5pY2FsIHJlcGxpY2F0ZSIsIHZhbHVlcyA9IGMoMTYsMSkpKyANCiAgI2dlb21fbGFiZWxfcmVwZWwoZGF0YSA9IFBDQW9iamVjdF90b3AyMDAwX2dncGxvdFtzZXEoZnJvbT0yMSwgdG8gPTQwLCBieT0yKSxdLA0KICAjICAgICAgICAgICAgICAgICBhZXMoeD1QQzEsIHk9IFBDMiwgY29sb3VyPSB0cmVhdG1lbnQsIGxhYmVsPVJvdy5uYW1lcyksDQogICMgICAgICAgICAgICAgICAgIHNpemUgPSAzLCBzaG93LmxlZ2VuZCA9IEZBTFNFLA0KICAjICAgICAgICAgICAgICAgICBmaWxsID0gIndoaXRlIiwNCiAgIyAgICAgICAgICAgICAgICAgbWF4Lm92ZXJsYXBzPSA1MCwNCiAgIyAgICAgICAgICAgICAgICAgI3hsaW0gPSBjKC1JbmYsIEluZikNCiAgIyAgICAgICAgICAgICAgICAgKSArIA0KICMgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gY29sb3JfY2F0ZWdvcmljYWxfc3RhZ2UpKw0KICAjeGxpbSgtNTUsIDU1KSsNCiAgI3lsaW0oLTU1LCA1NSkrDQogIHhsYWIocGFzdGUoIlBDMSAoIiwgcm91bmQoc3VtbWFyeShQQ0FvYmplY3RfdG9wMjAwMCkkaW1wb3J0YW5jZVsyXSoxMDAsMiksICIlKSIpKSArIA0KICB5bGFiKHBhc3RlKCJQQzIgKCIsIHJvdW5kKHN1bW1hcnkoUENBb2JqZWN0X3RvcDIwMDApJGltcG9ydGFuY2VbNV0qMTAwLDIpLCAiJSkiKSkrDQogIHRoZW1lX2NsYXNzaWMoKSsgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJyaWdodCIpDQpgYGANCg0KDQoNCg0KIyMjIyMgVG9wIGNvbnRyaWJ1dG9ycyBQQzEgKHRyZWF0bWVudCAoTVBJIHZzIFQzLCBUM0NQRikpDQoNCldlIHdpbGwgaGVyZSBhbmFseXNlIHRoZSBtYWluIGdlbmVzIGRyaXZpbmcgc2VwYXJhdGlvbiBhbG9uZyBQQzEuDQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KIyNwbG90IHRvcCA1MCBjb250cmlidXRpbmcgZ2VuZXMgdG8gUENBMSAobGl2ZXIgdnMgb3RoZXJzKQ0KI2ZpbmQgbGlzdCBvZiB0b3AgKDUwKSBjb250cmlidXRpbmcgZ2VuZXMNCmNvbnRyaWJfZGF0YSA8LSBmdml6X2NvbnRyaWIoUENBb2JqZWN0X3RvcDIwMDAsIGNob2ljZSA9ICJ2YXIiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhlcyA9IDEsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3AgPSA1MA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICApDQoNCiNQQzFQQzJfVE9QNTBfY29udHJpYnV0b3JzIDwtIGNvbnRyaWJfZGF0YVtbInBsb3RfZW52Il1dW1siZGF0YV9zdW0iXV1bWyJuYW1lIl1dDQpQQzFfVE9QNTBfY29udHJpYnV0b3JzIDwtIGRhdGEuZnJhbWUoImdlbmVzIiA9IHNhcHBseShjb250cmliX2RhdGFbWyJwbG90X2VudiJdXVtbImRhdGFfc3VtIl1dW1sibmFtZSJdXSwgYXMuY2hhcmFjdGVyKSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbnRyaWJ1dGlvbiB0byBQQzFQQzIiID0gY29udHJpYl9kYXRhW1sicGxvdF9lbnYiXV1bWyJkYXRhX3N1bSJdXVtbImNvbnRyaWIiXV0pDQojYWRkIGEgY29sdW1uIHdpdGggdGhlIG9yaWdpbmFsIE5DQkkgaWRzDQpQQzFfVE9QNTBfY29udHJpYnV0b3JzJGVudHJlel9JRCA8LSBlbnRyZXppZDJuYW1lX2NvbnZlcnRlciRlbnRyZXpfSURbbWF0Y2goUEMxX1RPUDUwX2NvbnRyaWJ1dG9ycyRnZW5lcyAsZW50cmV6aWQybmFtZV9jb252ZXJ0ZXIkdW5pcXVlX2Rlc2NyaXB0aW9uKV0gDQojYWRkIGEgY29sdW1uIHdpdGggdGhlIGVuc2VtYmwgZGVzY3JpcHRpb24NClBDMV9UT1A1MF9jb250cmlidXRvcnMkZW5zZW1ibF9kZXNjcmlwdGlvbiA8LSBhbm5vdGF0aW9uX2luZm8kZW5zZW1ibF9kZXNjcmlwdGlvblttYXRjaChQQzFfVE9QNTBfY29udHJpYnV0b3JzJGVudHJlel9JRCAsYW5ub3RhdGlvbl9pbmZvJGVudHJlel9JRCldIA0KI3JlYXJyYW5nZSBjb2x1bW4gb3JkZXINClBDMV9UT1A1MF9jb250cmlidXRvcnMgPC0gUEMxX1RPUDUwX2NvbnRyaWJ1dG9yc1ssYygzLDEsNCwyKV0NCg0KI2xpc3QgdG9wIGNvbnRyaWJ1dGluZyBnZW5lcw0KI2thYmxlKFBDMV9UT1A1MF9jb250cmlidXRvcnMsIGNhcHRpb24gPSAiVG9wNTAgZ2VuZXMgZHJpdmluZyBQQzEgc2VwYXJhdGlvbiIpDQoNCiNzYXZlIGRhdGFmcmFtZSBmb3IgbWFudWFsIGFubm90YXRpb24NCiN3cml0ZS5jc3YoUEMxUEMyX1RPUDUwX2NvbnRyaWJ1dG9ycywiQzovL1VzZXJzL0RvY3Rvci9EZXNrdG9wL1JOQXNlcV9hbmFseXNlcy9Bb2NlbGxhcmlzX21ldGFtb3JwaG9zaXMvU2F2ZWRfb2JqZWN0cy9QQzFQQzJfVE9QNTBfY29udHJpYnV0b3JzX29uVG9wMTAwMHZhcmlhbnRnZW5lcy5jc3YiLHJvdy5uYW1lcyA9IEZBTFNFKQ0KDQojcmVtb3ZlZCB1bnVzZWQgdmFyaWFibGVzDQojcm0oY29udHJpYl9kYXRhKQ0KDQoNCiMjIEZvcm1hdHRhYmxlIG91dHB1dA0KDQpmb3JtYXR0YWJsZShQQzFfVE9QNTBfY29udHJpYnV0b3JzLCANCiAgICAgICAgICAgICBjYXB0aW9uID0iVG9wNTAgZ2VuZXMgZHJpdmluZyBQQzEgc2VwYXJhdGlvbiIsDQogICAgICAgICAgICBhbGlnbiA9YygiYyIsImwiLCAibCIsICJjIiksIA0KICAgICAgICAgICAgbGlzdChgZW50cmV6X0lEYCA9IGZvcm1hdHRlcigic3BhbiIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZSA9IHggfiBzdHlsZSgNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvciA9ICIjQTlBOUE5IiwgZm9udC53ZWlnaHQgPSAiYm9sZCIpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksIA0KICAgICAgICAgICAgICAgICBgY29udHJpYnV0aW9uLnRvLlBDMVBDMmA9IGNvbG9yX3RpbGUoTkEsImxpZ2h0Y29yYWwiKQ0KDQogICAgICAgICAgICAgICAgICkNCiAgICAgICAgICAgICkNCg0KDQoNCmBgYA0KDQoNCkJlbG93LCB0aGUgYmlwbG90IHNob3dpbmcgdGhlIHJlbGF0aXZlIGluZmx1ZW5jZSBvZiBlYWNoIG9mIHRoZSBnZW5lcw0KDQpgYGB7ciwgZmlnLndpZHRoPTIwLCBmaWcuaGVpZ2h0PTUsIHdhcm5pbmc9RkFMU0UsIGVjaG89RkFMU0V9DQpwbG90cyA8LSBsaXN0KCkNCg0KcGxvdHNbWzFdXSA8LSBnZ3Bsb3QoUENBb2JqZWN0X3RvcDIwMDBfZ2dwbG90LA0KICAgICAgIGFlcyhQQzEsUEMyLGNvbG91cj10cmVhdG1lbnQsIHNoYXBlPWxhbmUpKSsNCiAgZ2VvbV9wb2ludChzaXplPTMpKw0KICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gY29sb3JfY2F0ZWdvcmljYWxfdHJlYXRtZW50KSsNCiAgc2NhbGVfc2hhcGVfbWFudWFsKHZhbHVlcyA9IGMoMTYsMSkpKyANCiAgI3NjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGNvbG9yX2NhdGVnb3JpY2FsX3N0YWdlKSsNCiAgI3hsaW0oLTU1LCA1NSkrDQogICN5bGltKC01NSwgNTUpKw0KICB4bGFiKHBhc3RlKCJQQzEgKCIsIHJvdW5kKHN1bW1hcnkoUENBb2JqZWN0X3RvcDIwMDApJGltcG9ydGFuY2VbMl0qMTAwLDIpLCAiJSkiKSkgKyANCiAgeWxhYihwYXN0ZSgiUEMyICgiLCByb3VuZChzdW1tYXJ5KFBDQW9iamVjdF90b3AyMDAwKSRpbXBvcnRhbmNlWzVdKjEwMCwyKSwgIiUpIikpKw0KICB0aGVtZV9jbGFzc2ljKCkrIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpDQoNCmNvcnJlbGF0aW9ubG9hZGluZ3MgPC0gYXMuZGF0YS5mcmFtZShjb3IoY291bnRzX1ZTVF90b3AyMDAwX3RyYW5zcG9zZWQsIFBDQW9iamVjdF90b3AyMDAwJHgpKQ0KY29ycmVsYXRpb25sb2FkaW5nc19QQzFzdWJzZXQgPC0gY29ycmVsYXRpb25sb2FkaW5nc1t1bmxpc3QoUEMxX1RPUDUwX2NvbnRyaWJ1dG9yc1siZ2VuZXMiXSlbMTo1MF0sMToyXQ0KY29ycmVsYXRpb25sb2FkaW5nc19QQzFzdWJzZXQkZ2VuZXMgPC0gcm93Lm5hbWVzKGNvcnJlbGF0aW9ubG9hZGluZ3NfUEMxc3Vic2V0KQ0KY29ycmVsYXRpb25sb2FkaW5nc19QQzFzdWJzZXQkc3ltYm9scyA8LSBhbm5vdGF0aW9uX2luZm8kbWVyZ2VkX3N5bWJvbFttYXRjaChjb3JyZWxhdGlvbmxvYWRpbmdzX1BDMXN1YnNldCRnZW5lcywgYW5ub3RhdGlvbl9pbmZvJG1lcmdlZF9kZXNjcmlwdGlvbildDQoNCnBsb3RzW1syXV0gPC0gZ2dwbG90KGNvcnJlbGF0aW9ubG9hZGluZ3NfUEMxc3Vic2V0LA0KICAgICAgIGFlcyhQQzEsUEMyLA0KICAgICAgICAgICAjY29sb3VyPSAiZmlyZWJyaWNrMSIsIA0KICAgICAgICAgICBsYWJlbCA9IGdlbmVzDQogICAgICAgICAgICkNCiAgICAgICApKw0KICBnZW9tX3BvaW50KHNpemU9MywgY29sb3I9IGlmZWxzZShjb3JyZWxhdGlvbmxvYWRpbmdzX1BDMXN1YnNldCRQQzE+MCwgImxpZ2h0Y29yYWwiLCAiZ3JheTMwIiksIGFscGhhPTAuNSkrDQogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjb2xvcl9jYXRlZ29yaWNhbF90cmVhdG1lbnQpKw0KICBnZW9tX2xhYmVsX3JlcGVsKHNpemUgPSAzLCBzaG93LmxlZ2VuZCA9IEZBTFNFLA0KICAgICAgICAgICAgICAgICAgIGZpbGwgPSAid2hpdGUiLA0KICAgICAgICAgICAgICAgICAgIGNvbG9yID0gaWZlbHNlKGNvcnJlbGF0aW9ubG9hZGluZ3NfUEMxc3Vic2V0JFBDMT4wLCAibGlnaHRjb3JhbCIsICJncmF5MzAiKSwNCiAgICAgICAgICAgICAgICAgICBtYXgub3ZlcmxhcHM9IDUwLA0KICAgICAgICAgICAgICAgICAgICN4bGltID0gYygtSW5mLCBJbmYpDQogICAgICAgICAgICAgICAgICAgKSArIA0KICBjb29yZF9jYXJ0ZXNpYW4oY2xpcCA9ICJvZmYiKSArDQogIHhsaW0oLTEsIDEpKw0KICB5bGltKC0xLCAxKSsNCiAgeGxhYihwYXN0ZSgiUEMxICgiLCByb3VuZChzdW1tYXJ5KFBDQW9iamVjdF90b3AyMDAwKSRpbXBvcnRhbmNlWzJdKjEwMCwyKSwgIiUpIikpICsgDQogIHlsYWIocGFzdGUoIlBDMiAoIiwgcm91bmQoc3VtbWFyeShQQ0FvYmplY3RfdG9wMjAwMCkkaW1wb3J0YW5jZVs1XSoxMDAsMiksICIlKSIpKSsNCiAgdGhlbWVfY2xhc3NpYygpKw0KICMgdGhlbWUocGxvdC5tYXJnaW4gPSB1bml0KGMoMCwtMTAsMCwtMTApLCAiY20iKSkrDQogIGFubm90YXRlKCJwYXRoIiwNCiAgIHg9MCsxKmNvcyhzZXEoMCwyKnBpLGxlbmd0aC5vdXQ9MTAwKSksDQogICB5PTArMSpzaW4oc2VxKDAsMipwaSxsZW5ndGgub3V0PTEwMCkpKQ0KDQoNCnBsb3RzW1szXV0gPC0gZ2dwbG90KGNvcnJlbGF0aW9ubG9hZGluZ3NfUEMxc3Vic2V0LA0KICAgICAgIGFlcyhQQzEsUEMyLA0KICAgICAgICAgICAjY29sb3VyPSAiZmlyZWJyaWNrMSIsIA0KICAgICAgICAgICBsYWJlbCA9IHN5bWJvbHMNCiAgICAgICAgICAgKQ0KICAgICAgICkrDQogIGdlb21fcG9pbnQoc2l6ZT0zLCBjb2xvcj0gaWZlbHNlKGNvcnJlbGF0aW9ubG9hZGluZ3NfUEMxc3Vic2V0JFBDMT4wLCAibGlnaHRjb3JhbCIsICJncmF5MzAiKSwgYWxwaGE9MC41KSsNCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGNvbG9yX2NhdGVnb3JpY2FsX3RyZWF0bWVudCkrDQogIGdlb21fbGFiZWxfcmVwZWwoc2l6ZSA9IDMsIHNob3cubGVnZW5kID0gRkFMU0UsDQogICAgICAgICAgICAgICAgICAgZmlsbCA9ICJ3aGl0ZSIsDQogICAgICAgICAgICAgICAgICAgY29sb3IgPSBpZmVsc2UoY29ycmVsYXRpb25sb2FkaW5nc19QQzFzdWJzZXQkUEMxPjAsICJsaWdodGNvcmFsIiwgImdyYXkzMCIpLA0KICAgICAgICAgICAgICAgICAgIG1heC5vdmVybGFwcz0gNDAsDQogICAgICAgICAgICAgICAgICAgI3hsaW0gPSBjKC1JbmYsIEluZikNCiAgICAgICAgICAgICAgICAgICApICsgDQogIGNvb3JkX2NhcnRlc2lhbihjbGlwID0gIm9mZiIpICsNCiAgeGxpbSgtMSwgMSkrDQogIHlsaW0oLTEsIDEpKw0KICB4bGFiKHBhc3RlKCJQQzEgKCIsIHJvdW5kKHN1bW1hcnkoUENBb2JqZWN0X3RvcDIwMDApJGltcG9ydGFuY2VbMl0qMTAwLDIpLCAiJSkiKSkgKyANCiAgeWxhYihwYXN0ZSgiUEMyICgiLCByb3VuZChzdW1tYXJ5KFBDQW9iamVjdF90b3AyMDAwKSRpbXBvcnRhbmNlWzVdKjEwMCwyKSwgIiUpIikpKw0KICB0aGVtZV9jbGFzc2ljKCkrDQogIyB0aGVtZShwbG90Lm1hcmdpbiA9IHVuaXQoYygwLC0xMCwwLC0xMCksICJjbSIpKSsNCiAgYW5ub3RhdGUoInBhdGgiLA0KICAgeD0wKzEqY29zKHNlcSgwLDIqcGksbGVuZ3RoLm91dD0xMDApKSwNCiAgIHk9MCsxKnNpbihzZXEoMCwyKnBpLGxlbmd0aC5vdXQ9MTAwKSkpDQoNCnBhcihtYXI9Yyg1LDEwLDQsMTApKy4xLCAiY20iKQ0KDQoNCnBsb3RzW1sxXV0gPC0gcGxvdHNbWzFdXSArIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikNCg0KcGxvdHNbWzRdXSA8LQ0KICBnZ2RyYXcoKSArDQogIGRyYXdfcGxvdChwbG90c1tbM11dKSArDQogIGRyYXdfcGxvdChwbG90c1tbMV1dLCB4ID0gMC43LCB5ID0gLTAuMDYsIHdpZHRoID0gLjMsIGhlaWdodCA9IC4zKQ0KDQoNCmdnYXJyYW5nZShwbG90bGlzdCA9IHBsb3RzLCBuY29sID0gNCwgY29tbW9uLmxlZ2VuZCA9IFRSVUUsIGxlZ2VuZCA9ICJub25lIikNCiNrYWJsZShjb3JyZWxhdGlvbmxvYWRpbmdzX1BDMXN1YnNldFssYygic3ltYm9scyIsICJnZW5lcyIpXSwgY2FwdGlvbiA9ICJHZW5lLXN5bWJvbCBkaWN0aW9uYXJ5IikNCg0KI3JlbW92ZSB1bnVzZWQgdmFyaWFibGVzDQpybShwbG90cywgY29ycmVsYXRpb25sb2FkaW5nc19QQzFzdWJzZXQpDQpgYGANCg0KDQo8YnIgLz4NCkJlbG93LCBhIGRlZGljYXRlZCB2aXN1YWxpc2F0aW9uIG9mIHRoZSByZWxhdGl2ZSBsZXZlbCBvZiBleHByZXNzaW9uIG9mIGVhY2ggZ2VuZSwgaW4gZWFjaCBzYW1wbGUuDQoNCmBgYHtyLCBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9NjAsIGVjaG89RkFMU0V9DQojaHR0cDovL2Fncm9uaW5mb3RlY2guYmxvZ3Nwb3QuY29tLzIwMjAvMDYvYmlwbG90LWZvci1wY3MtdXNpbmctYmFzZS1ncmFwaGljLmh0bWwNCiMgd2UgY2FuIG5vdyB2ZXJpZnkgaG93IHRoZXNlIHRvcCA1MCBnZW5lcyBhY3R1YWxseSBtb3ZlIG91ciBzYW1wbGVzIGFjcm9zcyBkaW1lbnNpb25zDQojIGRlZmluZSBwYWxldHRlDQpteXBhbGV0dGUgPC0gYnJld2VyLnBhbCg5LCJSZEJ1IikgI2Z1bmN0aW9uLiDigJxSZFlsQnXigJ0gaXMgYSBjb21tb24gY2hvaWNlLCBhbmQg4oCcU3BlY3RyYWzigJ0gaXMgYWxzbyBuaWNlLg0KbW9yZWNvbHMgPC0gY29sb3JSYW1wUGFsZXR0ZShteXBhbGV0dGUpDQpjb2xvcnJhbmdlPXJldihtb3JlY29scygxMDApKQ0KDQojc2V0IHJvd3MgYW5kIGNvbHVtbnMgKDQpDQpwYXIobWZyb3c9YygobGVuZ3RoKHVubGlzdChQQzFfVE9QNTBfY29udHJpYnV0b3JzWyJnZW5lcyJdKSkvMykrMSwzKSkNCg0KI3Bsb3QgbG9vcA0KZm9yIChpIGluIDE6bGVuZ3RoKHVubGlzdChQQzFfVE9QNTBfY29udHJpYnV0b3JzWyJnZW5lcyJdKSkpIHsNCiAgZ2VuZV9vZl9pbnRlcmVzdCA8LSB1bmxpc3QoUEMxX1RPUDUwX2NvbnRyaWJ1dG9yc1siZ2VuZXMiXSlbaV0NCiAgDQogICNub3JtYWxpc2UgdmFsdWVzIG9mIGV4cHJlc3Npb24gZm9yIGdlbmUgWCAoZS5nIGhiYWU1KQ0KICAjY29sb3J2YWx1ZXMgPC0gMTAwKihjb3VudHNfVlNUX3RvcDEwMDBfdHJhbnNwb3NlZFssZ2VuZV9vZl9pbnRlcmVzdF0rYWJzKG1pbihjb3VudHNfVlNUX3RvcDEwMDBfdHJhbnNwb3NlZFssZ2VuZV9vZl9pbnRlcmVzdF0pKSkvKG1heChjb3VudHNfVlNUX3RvcDEwMDBfdHJhbnNwb3NlZFssZ2VuZV9vZl9pbnRlcmVzdF0rYWJzKG1pbihjb3VudHNfVlNUX3RvcDEwMDBfdHJhbnNwb3NlZFssZ2VuZV9vZl9pbnRlcmVzdF0pKSkpICN0cmFuc3Bvc2UgYWxsIHZhbHVlcyBhYm92ZSAwIGJ5IGFkZGluZyBtaW5pbWFsIHZhbHVlIChjb3VsZCBiZSBuZWdhdGl2ZSkgdG8gYWxsLiBUaGUgbm9ybWFsaXNlZCBieSBtYXggaW50ZW5zaXR5IHRvIDEuIFRoZW4gb24gMTAwIHNjYWxlDQogIGNvbG9ydmFsdWVzIDwtIDEwMCooY291bnRzX1ZTVF90b3AyMDAwX3RyYW5zcG9zZWRbLGdlbmVfb2ZfaW50ZXJlc3RdKS8obWF4KGNvdW50c19WU1RfdG9wMjAwMF90cmFuc3Bvc2VkWyxnZW5lX29mX2ludGVyZXN0XSkpDQogIA0KICANCiAgI2NvbG9yIGRhdGFwb2ludHMgKG9ic2VydmF0aW9ucykgYnkgZXhwcmVzc2lvbiBsZXZlbA0KICBwYXIocHR5ID0gInMiLA0KICAgIGNleC5tYWluID0gMS4yLA0KICAgIGNleC5sYWIgPSAxLA0KICAgIGZvbnQubWFpbiA9IDIsDQogICAgZm9udC5sYWIgPSAyLA0KICAgIGZhbWlseSA9ICJzYW5zIiwNCiAgICBjb2wubWFpbiA9ICJncmF5MTAiLA0KICAgIGNvbC5sYWIgPSAiZ3JheTEwIiwNCiAgICBmZyA9ICJncmF5MTAiLA0KICAgIGxhcyA9IDEpDQogIA0KICBwbG90Lm5ldygpDQogIA0KICAjd2UgYXJlIGZpcnN0IGdvaW5nIHRvIHBsb3QgdGhlIGRpZmZlcmVudCBjb25kaXRpb25zIChzYW1wbGVzKSwgd2hpY2ggYXJlIGluIFBDQW9iamVjdF90b3AyMDAwJHggDQogIHBsb3Qud2luZG93KHhsaW0gPSBleHRlbmRyYW5nZShyYW5nZShQQ0FvYmplY3RfdG9wMjAwMCR4WywgMV0pLCBmID0gMC4xKSwgDQogICAgICAgICAgICB5bGltID0gZXh0ZW5kcmFuZ2UocmFuZ2UoUENBb2JqZWN0X3RvcDIwMDAkeFssIDJdKSwgZiA9IDAuMSksIA0KICAgICAgICAgICAgYXNwID0gMSkNCiAgYXhpcyhzaWRlID0gMSwgDQogICAgIGxhYmVscyA9IFRSVUUpDQogIGF4aXMoc2lkZSA9IDIsIA0KICAgICBsYWJlbHMgPSBUUlVFKQ0KICB0aXRsZShtYWluID0gZ2VuZV9vZl9pbnRlcmVzdCwNCiAgICAgICAgeGxhYiA9IHBhc3RlKCJQQyAxICgiLCANCiAgICAgICAgICAgICAgICAgICByb3VuZChzdW1tYXJ5KFBDQW9iamVjdF90b3AyMDAwKSRpbXBvcnRhbmNlWzJdKjEwMCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgZGlnaXRzID0gMSksDQogICAgICAgICAgICAgICAgICAgIiUpIiwgDQogICAgICAgICAgICAgICAgICAgc2VwID0gIiIpLCANCiAgICAgIHlsYWIgPSBwYXN0ZSgiUEMgMiAoIiwgDQogICAgICAgICAgICAgICAgICAgcm91bmQoc3VtbWFyeShQQ0FvYmplY3RfdG9wMjAwMCkkaW1wb3J0YW5jZVs1XSoxMDAsIA0KICAgICAgICAgICAgICAgICAgICAgICAgIGRpZ2l0cyA9IDEpLA0KICAgICAgICAgICAgICAgICAgICIlKSIsIA0KICAgICAgICAgICAgICAgICAgIHNlcCA9ICIiKSwgDQogICAgICAjbGluZSA9IDIsDQogICAgICBhZGogPSAwLjUpDQogIA0KICAjIHBsb3QgdGhlIGRpZmZlcmVudCBjb25kaXRpb25zIChzYW1wbGVzKQ0KICBwb2ludHMoeCA9IFBDQW9iamVjdF90b3AyMDAwJHhbLDE6Ml0sDQogICAgICAgcGNoID0gMTYsDQogICAgICAgY2V4ID0gMiwNCiAgICAgICBjb2wgPSBjb2xvcnJhbmdlW2NvbG9ydmFsdWVzXQ0KICAgICAgICNjb2wgPSByZXAoYygiYmxhY2siLCJncmF5NTAiLCAiZ3JheTM1IiksZWFjaD03KQ0KICAgICAgICkNCiAgDQogICN0ZXh0KFBDQW9iamVjdF90b3AyMDAwJHhbLDE6Ml0tNSwgDQogICMgICAgIGxhYmVscyA9IHJvdy5uYW1lcyhQQ0FvYmplY3RfdG9wMjAwMCR4KSwgDQogICMgICAgIGNleCA9IDAuOCwNCiAgIyAgICAgZm9udCA9IDIsDQogICMgICAgIGNvbCA9ICJibGFjayINCiAgIyAgICAgKQ0KICANCiAgDQp9DQoNCiNyZW1vdmUgdW51c2VkIHZhcmlhYmxlcw0KI3JtKGNvbG9ycmFuZ2UsIGNvbG9ydmFsdWVzLCBnZW5lX29mX2ludGVyZXN0LCBpLCBteXBhbGV0dGUsIG1vcmVjb2xzKQ0KYGBgDQoNCiMjIyMjIFRvcCBjb250cmlidXRvcnMgUEMyIChDUEYgdnMgRE1TTy9UMykNCg0KV2Ugd2lsbCBoZXJlIGFuYWx5c2UgdGhlIG1haW4gZ2VuZXMgZHJpdmluZyBzZXBhcmF0aW9uIGFsb25nIFBDMi4NCg0KYGBge3IsIGVjaG89RkFMU0V9DQojI3Bsb3QgdG9wIDUwIGNvbnRyaWJ1dGluZyBnZW5lcyB0byBQQ0EyIChzdG9tYWNoIHZzIG90aGVycykNCiNmaW5kIGxpc3Qgb2YgdG9wICg1MCkgY29udHJpYnV0aW5nIGdlbmVzDQpjb250cmliX2RhdGEgPC0gZnZpel9jb250cmliKFBDQW9iamVjdF90b3AyMDAwLCBjaG9pY2UgPSAidmFyIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4ZXMgPSAyLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9wID0gNTANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQ0KDQojUEMxUEMyX1RPUDUwX2NvbnRyaWJ1dG9ycyA8LSBjb250cmliX2RhdGFbWyJwbG90X2VudiJdXVtbImRhdGFfc3VtIl1dW1sibmFtZSJdXQ0KUEMyX1RPUDUwX2NvbnRyaWJ1dG9ycyA8LSBkYXRhLmZyYW1lKCJnZW5lcyIgPSBzYXBwbHkoY29udHJpYl9kYXRhW1sicGxvdF9lbnYiXV1bWyJkYXRhX3N1bSJdXVtbIm5hbWUiXV0sIGFzLmNoYXJhY3RlciksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb250cmlidXRpb24gdG8gUEMxUEMyIiA9IGNvbnRyaWJfZGF0YVtbInBsb3RfZW52Il1dW1siZGF0YV9zdW0iXV1bWyJjb250cmliIl1dKQ0KI2FkZCBhIGNvbHVtbiB3aXRoIHRoZSBvcmlnaW5hbCBlbnNlbWJsX2dlbmVfaWRzDQpQQzJfVE9QNTBfY29udHJpYnV0b3JzJGVudHJlel9JRCA8LSBlbnRyZXppZDJuYW1lX2NvbnZlcnRlciRlbnRyZXpfSURbbWF0Y2goUEMyX1RPUDUwX2NvbnRyaWJ1dG9ycyRnZW5lcyAsZW50cmV6aWQybmFtZV9jb252ZXJ0ZXIkdW5pcXVlX2Rlc2NyaXB0aW9uKV0gDQojYWRkIGEgY29sdW1uIHdpdGggdGhlIGVuc2VtYmwgZGVzY3JpcHRpb24NClBDMl9UT1A1MF9jb250cmlidXRvcnMkZW5zZW1ibF9kZXNjcmlwdGlvbiA8LSBhbm5vdGF0aW9uX2luZm8kZW5zZW1ibF9kZXNjcmlwdGlvblttYXRjaChQQzJfVE9QNTBfY29udHJpYnV0b3JzJGVudHJlel9JRCAsYW5ub3RhdGlvbl9pbmZvJGVudHJlel9JRCldIA0KI3JlYXJyYW5nZSBjb2x1bW4gb3JkZXINClBDMl9UT1A1MF9jb250cmlidXRvcnMgPC0gUEMyX1RPUDUwX2NvbnRyaWJ1dG9yc1ssYygzLDEsNCwyKV0NCg0KI2xpc3QgdG9wIGNvbnRyaWJ1dGluZyBnZW5lcw0KI2thYmxlKFBDMl9UT1A1MF9jb250cmlidXRvcnMsIGNhcHRpb24gPSAiVG9wNTAgZ2VuZXMgZHJpdmluZyBQQzIgc2VwYXJhdGlvbiIpDQoNCiMjIEZvcm1hdHRhYmxlIG91dHB1dA0KDQpmb3JtYXR0YWJsZShQQzJfVE9QNTBfY29udHJpYnV0b3JzLCANCiAgICAgICAgICAgICBjYXB0aW9uID0iVG9wNTAgZ2VuZXMgZHJpdmluZyBQQzEgc2VwYXJhdGlvbiIsDQogICAgICAgICAgICBhbGlnbiA9YygiYyIsImwiLCAibCIsICJjIiksIA0KICAgICAgICAgICAgbGlzdChgZW50cmV6X0lEYCA9IGZvcm1hdHRlcigic3BhbiIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZSA9IHggfiBzdHlsZSgNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvciA9ICIjQTlBOUE5IiwgZm9udC53ZWlnaHQgPSAiYm9sZCIpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksIA0KICAgICAgICAgICAgICAgICBgY29udHJpYnV0aW9uLnRvLlBDMVBDMmA9IGNvbG9yX3RpbGUoTkEsImxpZ2h0Y29yYWwiKQ0KDQogICAgICAgICAgICAgICAgICkNCiAgICAgICAgICAgICkNCg0KDQojc2F2ZSBkYXRhZnJhbWUgZm9yIG1hbnVhbCBhbm5vdGF0aW9uDQojd3JpdGUuY3N2KFBDMVBDMl9UT1A1MF9jb250cmlidXRvcnMsIkM6Ly9Vc2Vycy9Eb2N0b3IvRGVza3RvcC9STkFzZXFfYW5hbHlzZXMvQW9jZWxsYXJpc19tZXRhbW9ycGhvc2lzL1NhdmVkX29iamVjdHMvUEMxUEMyX1RPUDUwX2NvbnRyaWJ1dG9yc19vblRvcDEwMDB2YXJpYW50Z2VuZXMuY3N2Iixyb3cubmFtZXMgPSBGQUxTRSkNCg0KI3JlbW92ZWQgdW51c2VkIHZhcmlhYmxlcw0Kcm0oY29udHJpYl9kYXRhKQ0KDQpgYGANCg0KDQo8YnIgLz4NCkJlbG93LCBhIGRlZGljYXRlZCB2aXN1YWxpc2F0aW9uIG9mIHRoZSByZWxhdGl2ZSBsZXZlbCBvZiBleHByZXNzaW9uIG9mIGVhY2ggZ2VuZSwgaW4gZWFjaCBzYW1wbGUuDQoNCmBgYHtyLCBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9NjAsIGVjaG89RkFMU0V9DQojaHR0cDovL2Fncm9uaW5mb3RlY2guYmxvZ3Nwb3QuY29tLzIwMjAvMDYvYmlwbG90LWZvci1wY3MtdXNpbmctYmFzZS1ncmFwaGljLmh0bWwNCiMgd2UgY2FuIG5vdyB2ZXJpZnkgaG93IHRoZXNlIHRvcCA1MCBnZW5lcyBhY3R1YWxseSBtb3ZlIG91ciBzYW1wbGVzIGFjcm9zcyBkaW1lbnNpb25zDQojIGRlZmluZSBwYWxldHRlDQpteXBhbGV0dGUgPC0gYnJld2VyLnBhbCg5LCJSZEJ1IikgI2Z1bmN0aW9uLiDigJxSZFlsQnXigJ0gaXMgYSBjb21tb24gY2hvaWNlLCBhbmQg4oCcU3BlY3RyYWzigJ0gaXMgYWxzbyBuaWNlLg0KbW9yZWNvbHMgPC0gY29sb3JSYW1wUGFsZXR0ZShteXBhbGV0dGUpDQpjb2xvcnJhbmdlPXJldihtb3JlY29scygxMDApKQ0KDQojc2V0IHJvd3MgYW5kIGNvbHVtbnMgKDQpDQpwYXIobWZyb3c9YygobGVuZ3RoKHVubGlzdChQQzJfVE9QNTBfY29udHJpYnV0b3JzWyJnZW5lcyJdKSkvMykrMSwzKSkNCg0KI3Bsb3QgbG9vcA0KZm9yIChpIGluIDE6bGVuZ3RoKHVubGlzdChQQzJfVE9QNTBfY29udHJpYnV0b3JzWyJnZW5lcyJdKSkpIHsNCiAgZ2VuZV9vZl9pbnRlcmVzdCA8LSB1bmxpc3QoUEMyX1RPUDUwX2NvbnRyaWJ1dG9yc1siZ2VuZXMiXSlbaV0NCiAgDQogICNub3JtYWxpc2UgdmFsdWVzIG9mIGV4cHJlc3Npb24gZm9yIGdlbmUgWCAoZS5nIGhiYWU1KQ0KICAjY29sb3J2YWx1ZXMgPC0gMTAwKihjb3VudHNfVlNUX3RvcDEwMDBfdHJhbnNwb3NlZFssZ2VuZV9vZl9pbnRlcmVzdF0rYWJzKG1pbihjb3VudHNfVlNUX3RvcDEwMDBfdHJhbnNwb3NlZFssZ2VuZV9vZl9pbnRlcmVzdF0pKSkvKG1heChjb3VudHNfVlNUX3RvcDEwMDBfdHJhbnNwb3NlZFssZ2VuZV9vZl9pbnRlcmVzdF0rYWJzKG1pbihjb3VudHNfVlNUX3RvcDEwMDBfdHJhbnNwb3NlZFssZ2VuZV9vZl9pbnRlcmVzdF0pKSkpICN0cmFuc3Bvc2UgYWxsIHZhbHVlcyBhYm92ZSAwIGJ5IGFkZGluZyBtaW5pbWFsIHZhbHVlIChjb3VsZCBiZSBuZWdhdGl2ZSkgdG8gYWxsLiBUaGUgbm9ybWFsaXNlZCBieSBtYXggaW50ZW5zaXR5IHRvIDEuIFRoZW4gb24gMTAwIHNjYWxlDQogIGNvbG9ydmFsdWVzIDwtIDEwMCooY291bnRzX1ZTVF90b3AyMDAwX3RyYW5zcG9zZWRbLGdlbmVfb2ZfaW50ZXJlc3RdKS8obWF4KGNvdW50c19WU1RfdG9wMjAwMF90cmFuc3Bvc2VkWyxnZW5lX29mX2ludGVyZXN0XSkpDQogIA0KICANCiAgI2NvbG9yIGRhdGFwb2ludHMgKG9ic2VydmF0aW9ucykgYnkgZXhwcmVzc2lvbiBsZXZlbA0KICBwYXIocHR5ID0gInMiLA0KICAgIGNleC5tYWluID0gMS4yLA0KICAgIGNleC5sYWIgPSAxLA0KICAgIGZvbnQubWFpbiA9IDIsDQogICAgZm9udC5sYWIgPSAyLA0KICAgIGZhbWlseSA9ICJzYW5zIiwNCiAgICBjb2wubWFpbiA9ICJncmF5MTAiLA0KICAgIGNvbC5sYWIgPSAiZ3JheTEwIiwNCiAgICBmZyA9ICJncmF5MTAiLA0KICAgIGxhcyA9IDEpDQogIA0KICBwbG90Lm5ldygpDQogIA0KICAjd2UgYXJlIGZpcnN0IGdvaW5nIHRvIHBsb3QgdGhlIGRpZmZlcmVudCBjb25kaXRpb25zIChzYW1wbGVzKSwgd2hpY2ggYXJlIGluIFBDQW9iamVjdF90b3AyMDAwJHggDQogIHBsb3Qud2luZG93KHhsaW0gPSBleHRlbmRyYW5nZShyYW5nZShQQ0FvYmplY3RfdG9wMjAwMCR4WywgMV0pLCBmID0gMC4xKSwgDQogICAgICAgICAgICB5bGltID0gZXh0ZW5kcmFuZ2UocmFuZ2UoUENBb2JqZWN0X3RvcDIwMDAkeFssIDJdKSwgZiA9IDAuMSksIA0KICAgICAgICAgICAgYXNwID0gMSkNCiAgYXhpcyhzaWRlID0gMSwgDQogICAgIGxhYmVscyA9IFRSVUUpDQogIGF4aXMoc2lkZSA9IDIsIA0KICAgICBsYWJlbHMgPSBUUlVFKQ0KICB0aXRsZShtYWluID0gZ2VuZV9vZl9pbnRlcmVzdCwNCiAgICAgICAgeGxhYiA9IHBhc3RlKCJQQyAxICgiLCANCiAgICAgICAgICAgICAgICAgICByb3VuZChzdW1tYXJ5KFBDQW9iamVjdF90b3AyMDAwKSRpbXBvcnRhbmNlWzJdKjEwMCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgZGlnaXRzID0gMSksDQogICAgICAgICAgICAgICAgICAgIiUpIiwgDQogICAgICAgICAgICAgICAgICAgc2VwID0gIiIpLCANCiAgICAgIHlsYWIgPSBwYXN0ZSgiUEMgMiAoIiwgDQogICAgICAgICAgICAgICAgICAgcm91bmQoc3VtbWFyeShQQ0FvYmplY3RfdG9wMjAwMCkkaW1wb3J0YW5jZVs1XSoxMDAsIA0KICAgICAgICAgICAgICAgICAgICAgICAgIGRpZ2l0cyA9IDEpLA0KICAgICAgICAgICAgICAgICAgICIlKSIsIA0KICAgICAgICAgICAgICAgICAgIHNlcCA9ICIiKSwgDQogICAgICAjbGluZSA9IDIsDQogICAgICBhZGogPSAwLjUpDQogIA0KICAjIHBsb3QgdGhlIGRpZmZlcmVudCBjb25kaXRpb25zIChzYW1wbGVzKQ0KICBwb2ludHMoeCA9IFBDQW9iamVjdF90b3AyMDAwJHhbLDE6Ml0sDQogICAgICAgcGNoID0gMTYsDQogICAgICAgY2V4ID0gMiwNCiAgICAgICBjb2wgPSBjb2xvcnJhbmdlW2NvbG9ydmFsdWVzXQ0KICAgICAgICNjb2wgPSByZXAoYygiYmxhY2siLCJncmF5NTAiLCAiZ3JheTM1IiksZWFjaD03KQ0KICAgICAgICkNCiAgDQogICN0ZXh0KFBDQW9iamVjdF90b3AyMDAwJHhbLDE6Ml0tNSwgDQogICMgICAgIGxhYmVscyA9IHJvdy5uYW1lcyhQQ0FvYmplY3RfdG9wMjAwMCR4KSwgDQogICMgICAgIGNleCA9IDAuOCwNCiAgIyAgICAgZm9udCA9IDIsDQogICMgICAgIGNvbCA9ICJibGFjayINCiAgIyAgICAgKQ0KICANCiAgDQp9DQoNCiNyZW1vdmUgdW51c2VkIHZhcmlhYmxlcw0Kcm0oY29sb3JyYW5nZSwgY29sb3J2YWx1ZXMsIGdlbmVfb2ZfaW50ZXJlc3QsIGksIG15cGFsZXR0ZSwgbW9yZWNvbHMpDQpgYGANCg0KIF9fRXhwbG9yZSBzYW1wbGUgZGlzdHJpYnV0aW9uIFBDMiBkcml2ZXJzX18NCg0KYGBge3IsIGVjaG89RkFMU0V9DQojbG9hZCB0aGUgY291bnRzX1ZTVCBvYmplY3QNCmxvYWQoIkQ6Ly9Bb2NlbGxhcmlzX0NQRl9NUElfVDMvU2F2ZWRfb2JqZWN0cy9jb3VudHNfVlNULnJkcyIpDQpgYGANCg0KYGBge3IsIGVjaG89RkFMU0V9DQojc2VsZWN0IGdlbmVzDQoNCmdlbmVsaXN0IDwtIFBDMl9UT1A1MF9jb250cmlidXRvcnMkZW50cmV6X0lEDQpzZWxlY3RlZF9nZW5lcyA8LSBjKGdlbmVsaXN0KQ0KYGBgDQoNCmBgYHtyLCBlY2hvPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQ0KIyBSZXR1cm5zIHRoZSBtaXNzaW5nIGdlbmVzOg0KbWlzc2luZ19nZW5lcyA8LSBhcy5kYXRhLmZyYW1lKHNldGRpZmYoc2VsZWN0ZWRfZ2VuZXMsIHJvdy5uYW1lcyhjb3VudHNfVlNUKSkpIA0KY29sbmFtZXMobWlzc2luZ19nZW5lcykgPC0gImVudHJlel9JRCINCm1pc3NpbmdfZ2VuZXMkZGVzY3JpcHRpb24gPC0gYW5ub3RhdGlvbl9pbmZvJG1lcmdlZF9kZXNjcmlwdGlvblttYXRjaChtaXNzaW5nX2dlbmVzJGVudHJlel9JRCxhbm5vdGF0aW9uX2luZm8kZW50cmV6X0lEKV0NCiNubyBtaXNzaW5nIGdlbmVzDQoNCiMgUmV0dXJucyB0aGUgZXhpc3RpbmcgZ2VuZXM6DQpzZWxlY3RlZF9nZW5lcyA8LSBhcy5kYXRhLmZyYW1lKGludGVyc2VjdChzZWxlY3RlZF9nZW5lcywgcm93Lm5hbWVzKGNvdW50c19WU1QpKSkNCmNvbG5hbWVzKHNlbGVjdGVkX2dlbmVzKSA8LSAiZW50cmV6X0lEIg0Kc2VsZWN0ZWRfZ2VuZXMkZGVzY3JpcHRpb24gPC0gYW5ub3RhdGlvbl9pbmZvJG1lcmdlZF9kZXNjcmlwdGlvblttYXRjaChzZWxlY3RlZF9nZW5lcyRlbnRyZXpfSUQsYW5ub3RhdGlvbl9pbmZvJGVudHJlel9JRCldDQoNCiNwcmludCBsaXN0IG9mIGRpY2FyZGVkIGdlbmVzIChiZWNhdXNlIG1pc3NpbmcpIGFuZCBvZiByZXRhaW5lZCBnZW5lcyAoY3VyYXRlZCBkaWdlc3Rpb24gZ2VuZXMsIHByZXNlbnQgaW4gdGhlIGRhdGFzZXQpDQoNCmthYmxlKG1pc3NpbmdfZ2VuZXMsIGNhcHRpb24gPSAiR2VuZXMgbWlzc2luZyBmcm9tIHRoZSBkYXRhc2V0IChpZ25vcmVkKSIpDQprYWJsZShzZWxlY3RlZF9nZW5lcywgY2FwdGlvbiA9ICJHZW5lcyBwcmVzZW50IGluIHRoZSBkYXRhc2V0IChyZXRhaW5lZCkiKQ0KDQojIyBzdWJzZXQgdGhlIG9yaWdpbmFsIFZTVCBvYmplY3RzIHRvIG9ubHkga2VlcCBzZWxlY3RlZCBnZW5lcw0KY291bnRzX1ZTVF9zZWxlY3RlZGdlbmVzIDwtIHN1YnNldChjb3VudHNfVlNULCByb3duYW1lcyhjb3VudHNfVlNUKSAlaW4lIHNlbGVjdGVkX2dlbmVzJGVudHJlel9JRCkNCnJvd25hbWVzKGNvdW50c19WU1Rfc2VsZWN0ZWRnZW5lcykgPC0gYW5ub3RhdGlvbl9pbmZvJG1lcmdlZF9kZXNjcmlwdGlvblttYXRjaChyb3duYW1lcyhjb3VudHNfVlNUX3NlbGVjdGVkZ2VuZXMpLCBhbm5vdGF0aW9uX2luZm8kZW50cmV6X0lEKV0NCg0KI3JlbW92ZSB1bnVzZWQgdmFyaWFibGVzDQpybShzZWxlY3RlZF9nZW5lcykNCg0KYGBgDQoNCmBgYHtyLCBmaWcuaGVpZ2h0PTgsIGZpZy53aWR0aD0xMCwgZWNobz1GQUxTRX0NCg0KIyNkZWZpbmUgdGhlIGNvbG9ycyBmb3IgdGhlIGhlYXRtYXAgKGNhdGVnb3JpY2FsKTogMSBjb2xvciBmb3IgZWFjaCBzbWFsbGVzdCBleHBlcmltZW50YWwgdW5pdCB0aGF0IGlzIGJlaW5nICBjb21wYXJlZDsgaS5lLiBoZXJlIHRoZSB0cmVhdG1lbnQNCmNvbG9yX2NhdGVnb3JpY2FsX2hlYXRtYXAgPC0gY29sb3JfY2F0ZWdvcmljYWxfdHJlYXRtZW50DQojbmFtZSB0aGlzIGxpc3Qgb2YgY29sb3Igd2l0aCB0aGUgY29ycmVzcG9uZGluZyBuYW1lcyAobm90ZTogdGhlc2UgYXJlIHRoZSB1bmlxdWUgdmFsdWVzIGZvciB0aGF0IGNhdGVnb3J5IGluIHRoZSBzYW1wbGUgbWV0YWRhdGEpDQpjb2xvcl9jYXRlZ29yaWNhbF9oZWF0bWFwX25hbWVkIDwtIGNvbG9yX2NhdGVnb3JpY2FsX2hlYXRtYXANCm5hbWVzKGNvbG9yX2NhdGVnb3JpY2FsX2hlYXRtYXBfbmFtZWQpIDwtIHVuaXF1ZShzYW1wbGVfbWV0YWRhdGEkdHJlYXRtZW50KQ0KDQojbG9hZCB0aGlzIGluZm9ybWF0aW9uIGludG8gdGhlIGhlYXRtYXANCmNvbEFubiA8LSBIZWF0bWFwQW5ub3RhdGlvbigjZGYgPSBkYXRhLmZyYW1lKHRyZWF0bWVudCA9IHNhbXBsZV9tZXRhZGF0YSR0cmVhdG1lbnQpLCAjdGhlIG5hbWUgb2YgdGhlIGNvbHVtbiBuZWVkcyB0byBtYXRjaCB0aGUgbmFtZSBvZiB0aGUgbmFtZWQgbGlzdA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICNjb2wgPSBsaXN0KCJ0cmVhdG1lbnQiID0gY29sb3JfY2F0ZWdvcmljYWxfaGVhdG1hcF9uYW1lZCksICNzZXQgdGhlIG5hbWUgb2YgdGhlIG5hbWVkIGxpc3Qgc28gaXQgbWF0Y2hlcw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICNhbm5vdGF0aW9uX3dpZHRoID0gdW5pdChjKDEsIDQpLCAnY20nKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjZ2FwID0gdW5pdCgxLCAnbW0nKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3dfbGVnZW5kID0gRkFMU0UsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd19hbm5vdGF0aW9uX25hbWUgPSBGQUxTRSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGljaCA9ICdjb2wnLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICNhbHNvIGNyZWF0ZSBhbiBlbXB0eSByb3cgYWJvZSB0aGUgaGVhdG1hcCwgdG8gZGlzcGxheSBhZGRpdGlvbmFsIGluZm8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbXB0eTEgPSBhbm5vX2VtcHR5KGJvcmRlciA9IEZBTFNFLCBoZWlnaHQ9IHVuaXQoOCwgIm1tIikpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKQ0KDQoNCkhlYXRtYXAobWF0ID0gdChzY2FsZSh0KGNvdW50c19WU1Rfc2VsZWN0ZWRnZW5lcykpKSwNCiAgICAgICAgbmFtZT0gInotc2NvcmUiLA0KICAgICAgICBjb2x1bW5fdGl0bGUgPSBndF9yZW5kZXIoDQogICAgICAgICAgIlBhdHRlcm4gb2YgZXhwcmVzc2lvbiAoYXMgPHNwYW4gc3R5bGU9J2NvbG9yOmJyb3duMic+Kip6LXNjb3JlcyoqPC9zcGFuPikgPGJyLz4gb2YgdGhlIHRvcCBjb250cmlidXRvcnMgdG8gUEMiDQogICAgICAgICAgKSwNCiAgICAgICAgY29sID0gcmV2KGJyZXdlci5wYWwoMTEsIlJkQnUiKSksDQogICAgICAgIG5hX2NvbCA9ICJibGFjayIsDQogICAgICAgIGNsdXN0ZXJfcm93cyA9IFQsDQogICAgICAgIHNob3dfcm93X2RlbmQgPSBULA0KICAgICAgICAjcm93X29yZGVyID0gb3JkZXJlZF9sZXZlbHMsDQogICAgICAgIGNsdXN0ZXJfY29sdW1ucyA9IEZBTFNFLA0KICAgICAgICBzaG93X2NvbHVtbl9kZW5kID0gRkFMU0UsDQogICAgICAgICNjb2x1bW5fb3JkZXIgPSBvcmRlcmVkX2xldmVscywNCiAgICAgICAgI3Jvd19zcGxpdCA9IGZhY3RvcihwYXN0ZTAoc2FtcGxlX21ldGFkYXRhJHNlZ21lbnQsIHNhbXBsZV9tZXRhZGF0YSRzdGFnZSksIGxldmVscyA9IGMoImxpdmVyUzEiLCAibGl2ZXJTNCIsICJsaXZlclM3IiwgInN0b21hY2hTMSIsICJpbnRlc3RpbmVTMSIsICJzdG9tYWNoUzQiLCAiQV9pbnRlc3RpbmVTNCIsICJQX2ludGVzdGluZVM0IiwgInN0b21hY2hTNyIsICJBX2ludGVzdGluZVM3IiwgIlBfaW50ZXN0aW5lUzciKSksDQogICAgICAgIGNvbHVtbl9zcGxpdCA9IGZhY3RvcihzYW1wbGVfbWV0YWRhdGEkdHJlYXRtZW50LCBsZXZlbHMgPSBjKCJETVNPIiwgIlQzSU9QIiwgIk1QSSIsICJDUEYiLCAiQ1BGLlQzSU9QIikpLA0KICAgICAgICAjY2x1c3Rlcl9yb3dfc2xpY2VzID0gRkFMU0UsDQogICAgICAgIGNsdXN0ZXJfY29sdW1uX3NsaWNlcyA9IEZBTFNFLA0KICAgICAgICByb3dfdGl0bGUgPSBOVUxMLA0KICAgICAgICByb3dfZ2FwID0gdW5pdCgwLjUsICJtbSIpLA0KICAgICAgICBjb2x1bW5fZ2FwID0gdW5pdChjKHJlcCgxMCwxKSwgcmVwKDIsMykpLCAibW0iKSwNCiAgICAgICAgI3dpZHRoID0gdW5pdCg4LCAiY20iKSwgDQogICAgICAgICNoZWlnaHQgPSB1bml0KDgsICJjbSIpLA0KICAgICAgICBjb2x1bW5fbmFtZXNfZ3AgPSBncmlkOjpncGFyKGZvbnRzaXplID0gOCksDQogICAgICAgIHJvd19uYW1lc19ncCA9IGdyaWQ6OmdwYXIoZm9udHNpemUgPSA4KSwNCiAgICAgICAgdG9wX2Fubm90YXRpb24gPSBjb2xBbm4sDQogICAgICAgICNsZWZ0X2Fubm90YXRpb24gPSByb3dBbm4sDQogICAgICAgIHNob3dfaGVhdG1hcF9sZWdlbmQgPSBUUlVFLA0KICAgICAgICBib3JkZXIgPSBUUlVFLA0KICAgICAgICBjbHVzdGVyaW5nX21ldGhvZF9yb3dzID0gJ3dhcmQuRDInDQogICAgICAgICkNCg0KDQpsaWJyYXJ5KEdldG9wdExvbmcpICAjIGZvciB0aGUgZnVuY3Rpb24gcXEoKQ0KZ3JvdXBfYmxvY2tfYW5ubyA9IGZ1bmN0aW9uKGdyb3VwLCBlbXB0eV9hbm5vLCBncCA9IGdwYXIoKSwgDQogICAgbGFiZWwgPSBOVUxMLCBsYWJlbF9ncCA9IGdwYXIoKSkgew0KDQogICAgc2Vla1ZpZXdwb3J0KHFxKCJhbm5vdGF0aW9uX0B7ZW1wdHlfYW5ub31fQHttaW4oZ3JvdXApfSIpKQ0KICAgIGxvYzEgPSBkZXZpY2VMb2MoeCA9IHVuaXQoMCwgIm5wYyIpLCB5ID0gdW5pdCgwLCAibnBjIikpDQogICAgc2Vla1ZpZXdwb3J0KHFxKCJhbm5vdGF0aW9uX0B7ZW1wdHlfYW5ub31fQHttYXgoZ3JvdXApfSIpKQ0KICAgIGxvYzIgPSBkZXZpY2VMb2MoeCA9IHVuaXQoMSwgIm5wYyIpLCB5ID0gdW5pdCgxLCAibnBjIikpDQoNCiAgICBzZWVrVmlld3BvcnQoImdsb2JhbCIpDQogICAgZ3JpZC5yZWN0KGxvYzEkeCwgbG9jMSR5LCB3aWR0aCA9IGxvYzIkeCAtIGxvYzEkeCwgaGVpZ2h0ID0gbG9jMiR5IC0gbG9jMSR5LCANCiAgICAgICAganVzdCA9IGMoImxlZnQiLCAiYm90dG9tIiksIGdwID0gZ3ApDQogICAgaWYoIWlzLm51bGwobGFiZWwpKSB7DQogICAgICAgIGdyaWQudGV4dChsYWJlbCwgeCA9IChsb2MxJHggKyBsb2MyJHgpKjAuNSwgeSA9IChsb2MxJHkgKyBsb2MyJHkpKjAuNSwgZ3AgPSBsYWJlbF9ncCkNCiAgICB9DQp9DQoNCmdyb3VwX2Jsb2NrX2Fubm8oMToxLCAiZW1wdHkxIiwgZ3AgPSBncGFyKGZpbGwgPSAiZ3JheTcwIiksIGxhYmVsID0gIkRNU08iKQ0KZ3JvdXBfYmxvY2tfYW5ubygyOjIsICJlbXB0eTEiLCBncCA9IGdwYXIoZmlsbCA9ICJwYWxlZ3JlZW4zIiksIGxhYmVsID0gIlQzK0lPUCIpDQpncm91cF9ibG9ja19hbm5vKDM6MywgImVtcHR5MSIsIGdwID0gZ3BhcihmaWxsID0gImxpZ2h0Y29yYWwiKSwgbGFiZWwgPSAiTVBJIikNCmdyb3VwX2Jsb2NrX2Fubm8oNDo0LCAiZW1wdHkxIiwgZ3AgPSBncGFyKGZpbGwgPSAibGlnaHRza3libHVlIiksIGxhYmVsID0gIkNQRiIpDQpncm91cF9ibG9ja19hbm5vKDU6NSwgImVtcHR5MSIsIGdwID0gZ3BhcihmaWxsID0gIm9yY2hpZDIiKSwgbGFiZWwgPSAiQ1BGK1QzK0lPUCIpDQoNCg0KYGBgDQoNCiMjIyMjIFRvcCBjb250cmlidXRvcnMgUEMzIChUMz8pDQoNCldlIHdpbGwgaGVyZSBhbmFseXNlIHRoZSBtYWluIGdlbmVzIGRyaXZpbmcgc2VwYXJhdGlvbiBhbG9uZyBQQzMuDQpgYGB7ciwgZWNobz1GQUxTRX0NCiMjcGxvdCB0b3AgNTAgY29udHJpYnV0aW5nIGdlbmVzIHRvIFBDQTMgKHN0YWdlKQ0KI2ZpbmQgbGlzdCBvZiB0b3AgKDUwKSBjb250cmlidXRpbmcgZ2VuZXMNCmNvbnRyaWJfZGF0YSA8LSBmdml6X2NvbnRyaWIoUENBb2JqZWN0X3RvcDIwMDAsIGNob2ljZSA9ICJ2YXIiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhlcyA9IDMsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3AgPSA1MA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICApDQoNCiNQQzFQQzJfVE9QNTBfY29udHJpYnV0b3JzIDwtIGNvbnRyaWJfZGF0YVtbInBsb3RfZW52Il1dW1siZGF0YV9zdW0iXV1bWyJuYW1lIl1dDQpQQzNfVE9QNTBfY29udHJpYnV0b3JzIDwtIGRhdGEuZnJhbWUoImdlbmVzIiA9IHNhcHBseShjb250cmliX2RhdGFbWyJwbG90X2VudiJdXVtbImRhdGFfc3VtIl1dW1sibmFtZSJdXSwgYXMuY2hhcmFjdGVyKSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbnRyaWJ1dGlvbiB0byBQQzFQQzIiID0gY29udHJpYl9kYXRhW1sicGxvdF9lbnYiXV1bWyJkYXRhX3N1bSJdXVtbImNvbnRyaWIiXV0pDQojYWRkIGEgY29sdW1uIHdpdGggdGhlIG9yaWdpbmFsIGVuc2VtYmxfZ2VuZV9pZHMNClBDM19UT1A1MF9jb250cmlidXRvcnMkZW50cmV6X0lEIDwtIGVudHJlemlkMm5hbWVfY29udmVydGVyJGVudHJlel9JRFttYXRjaChQQzNfVE9QNTBfY29udHJpYnV0b3JzJGdlbmVzICxlbnRyZXppZDJuYW1lX2NvbnZlcnRlciR1bmlxdWVfZGVzY3JpcHRpb24pXSANCiNhZGQgYSBjb2x1bW4gd2l0aCB0aGUgZW5zZW1ibCBkZXNjcmlwdGlvbg0KUEMzX1RPUDUwX2NvbnRyaWJ1dG9ycyRlbnNlbWJsX2Rlc2NyaXB0aW9uIDwtIGFubm90YXRpb25faW5mbyRlbnNlbWJsX2Rlc2NyaXB0aW9uW21hdGNoKFBDM19UT1A1MF9jb250cmlidXRvcnMkZW50cmV6X0lEICxhbm5vdGF0aW9uX2luZm8kZW50cmV6X0lEKV0gDQojcmVhcnJhbmdlIGNvbHVtbiBvcmRlcg0KUEMzX1RPUDUwX2NvbnRyaWJ1dG9ycyA8LSBQQzNfVE9QNTBfY29udHJpYnV0b3JzWyxjKDMsMSw0LDIpXQ0KDQojbGlzdCB0b3AgY29udHJpYnV0aW5nIGdlbmVzDQoja2FibGUoUEMzX1RPUDUwX2NvbnRyaWJ1dG9ycywgY2FwdGlvbiA9ICJUb3A1MCBnZW5lcyBkcml2aW5nIFBDMyBzZXBhcmF0aW9uIikNCg0KI3NhdmUgZGF0YWZyYW1lIGZvciBtYW51YWwgYW5ub3RhdGlvbg0KI3dyaXRlLmNzdihQQzFQQzJfVE9QNTBfY29udHJpYnV0b3JzLCJDOi8vVXNlcnMvRG9jdG9yL0Rlc2t0b3AvUk5Bc2VxX2FuYWx5c2VzL0FvY2VsbGFyaXNfbWV0YW1vcnBob3Npcy9TYXZlZF9vYmplY3RzL1BDMVBDMl9UT1A1MF9jb250cmlidXRvcnNfb25Ub3AxMDAwdmFyaWFudGdlbmVzLmNzdiIscm93Lm5hbWVzID0gRkFMU0UpDQoNCg0KIyMgRm9ybWF0dGFibGUgb3V0cHV0DQoNCmZvcm1hdHRhYmxlKFBDM19UT1A1MF9jb250cmlidXRvcnMsIA0KICAgICAgICAgICAgIGNhcHRpb24gPSJUb3A1MCBnZW5lcyBkcml2aW5nIFBDMSBzZXBhcmF0aW9uIiwNCiAgICAgICAgICAgIGFsaWduID1jKCJjIiwibCIsICJsIiwgImMiKSwgDQogICAgICAgICAgICBsaXN0KGBlbnRyZXpfSURgID0gZm9ybWF0dGVyKCJzcGFuIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlID0geCB+IHN0eWxlKA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yID0gIiNBOUE5QTkiLCBmb250LndlaWdodCA9ICJib2xkIikNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSwgDQogICAgICAgICAgICAgICAgIGBjb250cmlidXRpb24udG8uUEMxUEMyYD0gY29sb3JfdGlsZShOQSwibGlnaHRjb3JhbCIpDQoNCiAgICAgICAgICAgICAgICAgKQ0KICAgICAgICAgICAgKQ0KDQoNCiNyZW1vdmVkIHVudXNlZCB2YXJpYWJsZXMNCnJtKGNvbnRyaWJfZGF0YSkNCg0KYGBgDQoNCkJlbG93LCB0aGUgcmVsYXRpdmUgZXhwcmVzc2lvbiBsZXZlbA0KDQpgYGB7ciwgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTYwLCBlY2hvPUZBTFNFfQ0KI2h0dHA6Ly9hZ3JvbmluZm90ZWNoLmJsb2dzcG90LmNvbS8yMDIwLzA2L2JpcGxvdC1mb3ItcGNzLXVzaW5nLWJhc2UtZ3JhcGhpYy5odG1sDQojIHdlIGNhbiBub3cgdmVyaWZ5IGhvdyB0aGVzZSB0b3AgNTAgZ2VuZXMgYWN0dWFsbHkgbW92ZSBvdXIgc2FtcGxlcyBhY3Jvc3MgZGltZW5zaW9ucw0KIyBkZWZpbmUgcGFsZXR0ZQ0KbXlwYWxldHRlIDwtIGJyZXdlci5wYWwoOSwiUmRCdSIpICNmdW5jdGlvbi4g4oCcUmRZbEJ14oCdIGlzIGEgY29tbW9uIGNob2ljZSwgYW5kIOKAnFNwZWN0cmFs4oCdIGlzIGFsc28gbmljZS4NCm1vcmVjb2xzIDwtIGNvbG9yUmFtcFBhbGV0dGUobXlwYWxldHRlKQ0KY29sb3JyYW5nZT1yZXYobW9yZWNvbHMoMTAwKSkNCg0KI3NldCByb3dzIGFuZCBjb2x1bW5zICg0KQ0KcGFyKG1mcm93PWMoKGxlbmd0aCh1bmxpc3QoUEMzX1RPUDUwX2NvbnRyaWJ1dG9yc1siZ2VuZXMiXSkpLzMpKzEsMykpDQoNCiNwbG90IGxvb3ANCmZvciAoaSBpbiAxOmxlbmd0aCh1bmxpc3QoUEMzX1RPUDUwX2NvbnRyaWJ1dG9yc1siZ2VuZXMiXSkpKSB7DQogIGdlbmVfb2ZfaW50ZXJlc3QgPC0gdW5saXN0KFBDM19UT1A1MF9jb250cmlidXRvcnNbImdlbmVzIl0pW2ldDQogIA0KICAjbm9ybWFsaXNlIHZhbHVlcyBvZiBleHByZXNzaW9uIGZvciBnZW5lIFggKGUuZyBoYmFlNSkNCiAgI2NvbG9ydmFsdWVzIDwtIDEwMCooY291bnRzX1ZTVF90b3AxMDAwX3RyYW5zcG9zZWRbLGdlbmVfb2ZfaW50ZXJlc3RdK2FicyhtaW4oY291bnRzX1ZTVF90b3AxMDAwX3RyYW5zcG9zZWRbLGdlbmVfb2ZfaW50ZXJlc3RdKSkpLyhtYXgoY291bnRzX1ZTVF90b3AxMDAwX3RyYW5zcG9zZWRbLGdlbmVfb2ZfaW50ZXJlc3RdK2FicyhtaW4oY291bnRzX1ZTVF90b3AxMDAwX3RyYW5zcG9zZWRbLGdlbmVfb2ZfaW50ZXJlc3RdKSkpKSAjdHJhbnNwb3NlIGFsbCB2YWx1ZXMgYWJvdmUgMCBieSBhZGRpbmcgbWluaW1hbCB2YWx1ZSAoY291bGQgYmUgbmVnYXRpdmUpIHRvIGFsbC4gVGhlIG5vcm1hbGlzZWQgYnkgbWF4IGludGVuc2l0eSB0byAxLiBUaGVuIG9uIDEwMCBzY2FsZQ0KICBjb2xvcnZhbHVlcyA8LSAxMDAqKGNvdW50c19WU1RfdG9wMjAwMF90cmFuc3Bvc2VkWyxnZW5lX29mX2ludGVyZXN0XSkvKG1heChjb3VudHNfVlNUX3RvcDIwMDBfdHJhbnNwb3NlZFssZ2VuZV9vZl9pbnRlcmVzdF0pKQ0KICANCiAgDQogICNjb2xvciBkYXRhcG9pbnRzIChvYnNlcnZhdGlvbnMpIGJ5IGV4cHJlc3Npb24gbGV2ZWwNCiAgcGFyKHB0eSA9ICJzIiwNCiAgICBjZXgubWFpbiA9IDEuMiwNCiAgICBjZXgubGFiID0gMSwNCiAgICBmb250Lm1haW4gPSAyLA0KICAgIGZvbnQubGFiID0gMiwNCiAgICBmYW1pbHkgPSAic2FucyIsDQogICAgY29sLm1haW4gPSAiZ3JheTEwIiwNCiAgICBjb2wubGFiID0gImdyYXkxMCIsDQogICAgZmcgPSAiZ3JheTEwIiwNCiAgICBsYXMgPSAxKQ0KICANCiAgcGxvdC5uZXcoKQ0KICANCiAgI3dlIGFyZSBmaXJzdCBnb2luZyB0byBwbG90IHRoZSBkaWZmZXJlbnQgY29uZGl0aW9ucyAoc2FtcGxlcyksIHdoaWNoIGFyZSBpbiBQQ0FvYmplY3RfdG9wMjAwMCR4IA0KICBwbG90LndpbmRvdyh4bGltID0gZXh0ZW5kcmFuZ2UocmFuZ2UoUENBb2JqZWN0X3RvcDIwMDAkeFssIDNdKSwgZiA9IDAuMSksICNQQ0Egb24geCBheGlzDQogICAgICAgICAgICB5bGltID0gZXh0ZW5kcmFuZ2UocmFuZ2UoUENBb2JqZWN0X3RvcDIwMDAkeFssIDJdKSwgZiA9IDAuMSksICNQQ0Egb24geSBheGlzDQogICAgICAgICAgICBhc3AgPSAxKQ0KICBheGlzKHNpZGUgPSAxLCANCiAgICAgbGFiZWxzID0gVFJVRSkNCiAgYXhpcyhzaWRlID0gMiwgDQogICAgIGxhYmVscyA9IFRSVUUpDQogIHRpdGxlKG1haW4gPSBnZW5lX29mX2ludGVyZXN0LA0KICAgICAgICB4bGFiID0gcGFzdGUoIlBDIDMgKCIsIA0KICAgICAgICAgICAgICAgICAgIHJvdW5kKHN1bW1hcnkoUENBb2JqZWN0X3RvcDIwMDApJGltcG9ydGFuY2VbOF0qMTAwLCANCiAgICAgICAgICAgICAgICAgICAgICAgICBkaWdpdHMgPSAxKSwNCiAgICAgICAgICAgICAgICAgICAiJSkiLCANCiAgICAgICAgICAgICAgICAgICBzZXAgPSAiIiksIA0KICAgICAgeWxhYiA9IHBhc3RlKCJQQyAyICgiLCANCiAgICAgICAgICAgICAgICAgICByb3VuZChzdW1tYXJ5KFBDQW9iamVjdF90b3AyMDAwKSRpbXBvcnRhbmNlWzVdKjEwMCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgZGlnaXRzID0gMSksDQogICAgICAgICAgICAgICAgICAgIiUpIiwgDQogICAgICAgICAgICAgICAgICAgc2VwID0gIiIpLCANCiAgICAgICNsaW5lID0gMiwNCiAgICAgIGFkaiA9IDAuNSkNCiAgDQogICMgcGxvdCB0aGUgZGlmZmVyZW50IGNvbmRpdGlvbnMgKHNhbXBsZXMpDQogIHBvaW50cyh4ID0gUENBb2JqZWN0X3RvcDIwMDAkeFssMzoyXSwNCiAgICAgICBwY2ggPSAxNiwNCiAgICAgICBjZXggPSAyLA0KICAgICAgIGNvbCA9IGNvbG9ycmFuZ2VbY29sb3J2YWx1ZXNdDQogICAgICAgI2NvbCA9IHJlcChjKCJibGFjayIsImdyYXk1MCIsICJncmF5MzUiKSxlYWNoPTcpDQogICAgICAgKQ0KICANCiAgI3RleHQoUENBb2JqZWN0X3RvcDIwMDAkeFssMzoyXS01LCANCiAgIyAgICAgbGFiZWxzID0gcm93Lm5hbWVzKFBDQW9iamVjdF90b3AyMDAwJHgpLCANCiAgIyAgICAgY2V4ID0gMC44LA0KICAjICAgICBmb250ID0gMiwNCiAgIyAgICAgY29sID0gImJsYWNrIg0KICAjICAgICApDQogIA0KICANCn0NCg0KI3JlbW92ZSB1bnVzZWQgdmFyaWFibGVzDQpybShjb2xvcnJhbmdlLCBjb2xvcnZhbHVlcywgZ2VuZV9vZl9pbnRlcmVzdCwgaSwgbXlwYWxldHRlLCBtb3JlY29scykNCmBgYA0KDQogX19FeHBsb3JlIHNhbXBsZSBkaXN0cmlidXRpb24gUEMzIGRyaXZlcnNfXw0KDQpgYGB7ciwgZWNobz1GQUxTRX0NCiNsb2FkIHRoZSBjb3VudHNfVlNUIG9iamVjdA0KbG9hZCgiRDovL0FvY2VsbGFyaXNfQ1BGX01QSV9UMy9TYXZlZF9vYmplY3RzL2NvdW50c19WU1QucmRzIikNCmBgYA0KDQpgYGB7ciwgZWNobz1GQUxTRX0NCiNzZWxlY3QgZ2VuZXMNCg0KZ2VuZWxpc3QgPC0gUEMzX1RPUDUwX2NvbnRyaWJ1dG9ycyRlbnRyZXpfSUQNCnNlbGVjdGVkX2dlbmVzIDwtIGMoZ2VuZWxpc3QpDQpgYGANCg0KYGBge3IsIGVjaG89RkFMU0UsIGluY2x1ZGU9RkFMU0V9DQojIFJldHVybnMgdGhlIG1pc3NpbmcgZ2VuZXM6DQptaXNzaW5nX2dlbmVzIDwtIGFzLmRhdGEuZnJhbWUoc2V0ZGlmZihzZWxlY3RlZF9nZW5lcywgcm93Lm5hbWVzKGNvdW50c19WU1QpKSkgDQpjb2xuYW1lcyhtaXNzaW5nX2dlbmVzKSA8LSAiZW50cmV6X0lEIg0KbWlzc2luZ19nZW5lcyRkZXNjcmlwdGlvbiA8LSBhbm5vdGF0aW9uX2luZm8kbWVyZ2VkX2Rlc2NyaXB0aW9uW21hdGNoKG1pc3NpbmdfZ2VuZXMkZW50cmV6X0lELGFubm90YXRpb25faW5mbyRlbnRyZXpfSUQpXQ0KI25vIG1pc3NpbmcgZ2VuZXMNCg0KIyBSZXR1cm5zIHRoZSBleGlzdGluZyBnZW5lczoNCnNlbGVjdGVkX2dlbmVzIDwtIGFzLmRhdGEuZnJhbWUoaW50ZXJzZWN0KHNlbGVjdGVkX2dlbmVzLCByb3cubmFtZXMoY291bnRzX1ZTVCkpKQ0KY29sbmFtZXMoc2VsZWN0ZWRfZ2VuZXMpIDwtICJlbnRyZXpfSUQiDQpzZWxlY3RlZF9nZW5lcyRkZXNjcmlwdGlvbiA8LSBhbm5vdGF0aW9uX2luZm8kbWVyZ2VkX2Rlc2NyaXB0aW9uW21hdGNoKHNlbGVjdGVkX2dlbmVzJGVudHJlel9JRCxhbm5vdGF0aW9uX2luZm8kZW50cmV6X0lEKV0NCg0KI3ByaW50IGxpc3Qgb2YgZGljYXJkZWQgZ2VuZXMgKGJlY2F1c2UgbWlzc2luZykgYW5kIG9mIHJldGFpbmVkIGdlbmVzIChjdXJhdGVkIGRpZ2VzdGlvbiBnZW5lcywgcHJlc2VudCBpbiB0aGUgZGF0YXNldCkNCg0Ka2FibGUobWlzc2luZ19nZW5lcywgY2FwdGlvbiA9ICJHZW5lcyBtaXNzaW5nIGZyb20gdGhlIGRhdGFzZXQgKGlnbm9yZWQpIikNCmthYmxlKHNlbGVjdGVkX2dlbmVzLCBjYXB0aW9uID0gIkdlbmVzIHByZXNlbnQgaW4gdGhlIGRhdGFzZXQgKHJldGFpbmVkKSIpDQoNCiMjIHN1YnNldCB0aGUgb3JpZ2luYWwgVlNUIG9iamVjdHMgdG8gb25seSBrZWVwIHNlbGVjdGVkIGdlbmVzDQpjb3VudHNfVlNUX3NlbGVjdGVkZ2VuZXMgPC0gc3Vic2V0KGNvdW50c19WU1QsIHJvd25hbWVzKGNvdW50c19WU1QpICVpbiUgc2VsZWN0ZWRfZ2VuZXMkZW50cmV6X0lEKQ0Kcm93bmFtZXMoY291bnRzX1ZTVF9zZWxlY3RlZGdlbmVzKSA8LSBhbm5vdGF0aW9uX2luZm8kbWVyZ2VkX2Rlc2NyaXB0aW9uW21hdGNoKHJvd25hbWVzKGNvdW50c19WU1Rfc2VsZWN0ZWRnZW5lcyksIGFubm90YXRpb25faW5mbyRlbnRyZXpfSUQpXQ0KDQojcmVtb3ZlIHVudXNlZCB2YXJpYWJsZXMNCnJtKHNlbGVjdGVkX2dlbmVzKQ0KDQpgYGANCg0KYGBge3IsIGZpZy5oZWlnaHQ9OCwgZmlnLndpZHRoPTEwLCBlY2hvPUZBTFNFfQ0KDQojI2RlZmluZSB0aGUgY29sb3JzIGZvciB0aGUgaGVhdG1hcCAoY2F0ZWdvcmljYWwpOiAxIGNvbG9yIGZvciBlYWNoIHNtYWxsZXN0IGV4cGVyaW1lbnRhbCB1bml0IHRoYXQgaXMgYmVpbmcgIGNvbXBhcmVkOyBpLmUuIGhlcmUgdGhlIHRyZWF0bWVudA0KY29sb3JfY2F0ZWdvcmljYWxfaGVhdG1hcCA8LSBjb2xvcl9jYXRlZ29yaWNhbF90cmVhdG1lbnQNCiNuYW1lIHRoaXMgbGlzdCBvZiBjb2xvciB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIG5hbWVzIChub3RlOiB0aGVzZSBhcmUgdGhlIHVuaXF1ZSB2YWx1ZXMgZm9yIHRoYXQgY2F0ZWdvcnkgaW4gdGhlIHNhbXBsZSBtZXRhZGF0YSkNCmNvbG9yX2NhdGVnb3JpY2FsX2hlYXRtYXBfbmFtZWQgPC0gY29sb3JfY2F0ZWdvcmljYWxfaGVhdG1hcA0KbmFtZXMoY29sb3JfY2F0ZWdvcmljYWxfaGVhdG1hcF9uYW1lZCkgPC0gdW5pcXVlKHNhbXBsZV9tZXRhZGF0YSR0cmVhdG1lbnQpDQoNCiNsb2FkIHRoaXMgaW5mb3JtYXRpb24gaW50byB0aGUgaGVhdG1hcA0KY29sQW5uIDwtIEhlYXRtYXBBbm5vdGF0aW9uKCNkZiA9IGRhdGEuZnJhbWUodHJlYXRtZW50ID0gc2FtcGxlX21ldGFkYXRhJHRyZWF0bWVudCksICN0aGUgbmFtZSBvZiB0aGUgY29sdW1uIG5lZWRzIHRvIG1hdGNoIHRoZSBuYW1lIG9mIHRoZSBuYW1lZCBsaXN0DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgI2NvbCA9IGxpc3QoInRyZWF0bWVudCIgPSBjb2xvcl9jYXRlZ29yaWNhbF9oZWF0bWFwX25hbWVkKSwgI3NldCB0aGUgbmFtZSBvZiB0aGUgbmFtZWQgbGlzdCBzbyBpdCBtYXRjaGVzDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgI2Fubm90YXRpb25fd2lkdGggPSB1bml0KGMoMSwgNCksICdjbScpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICNnYXAgPSB1bml0KDEsICdtbScpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd19sZWdlbmQgPSBGQUxTRSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG93X2Fubm90YXRpb25fbmFtZSA9IEZBTFNFLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoID0gJ2NvbCcsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgI2Fsc28gY3JlYXRlIGFuIGVtcHR5IHJvdyBhYm9lIHRoZSBoZWF0bWFwLCB0byBkaXNwbGF5IGFkZGl0aW9uYWwgaW5mbw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtcHR5MSA9IGFubm9fZW1wdHkoYm9yZGVyID0gRkFMU0UsIGhlaWdodD0gdW5pdCg4LCAibW0iKSkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApDQoNCg0KSGVhdG1hcChtYXQgPSB0KHNjYWxlKHQoY291bnRzX1ZTVF9zZWxlY3RlZGdlbmVzKSkpLA0KICAgICAgICBuYW1lPSAiei1zY29yZSIsDQogICAgICAgIGNvbHVtbl90aXRsZSA9IGd0X3JlbmRlcigNCiAgICAgICAgICAiUGF0dGVybiBvZiBleHByZXNzaW9uIChhcyA8c3BhbiBzdHlsZT0nY29sb3I6YnJvd24yJz4qKnotc2NvcmVzKio8L3NwYW4+KSA8YnIvPiBvZiB0aGUgdG9wIGNvbnRyaWJ1dG9ycyB0byBQQyINCiAgICAgICAgICApLA0KICAgICAgICBjb2wgPSByZXYoYnJld2VyLnBhbCgxMSwiUmRCdSIpKSwNCiAgICAgICAgbmFfY29sID0gImJsYWNrIiwNCiAgICAgICAgY2x1c3Rlcl9yb3dzID0gVCwNCiAgICAgICAgc2hvd19yb3dfZGVuZCA9IFQsDQogICAgICAgICNyb3dfb3JkZXIgPSBvcmRlcmVkX2xldmVscywNCiAgICAgICAgY2x1c3Rlcl9jb2x1bW5zID0gRkFMU0UsDQogICAgICAgIHNob3dfY29sdW1uX2RlbmQgPSBGQUxTRSwNCiAgICAgICAgI2NvbHVtbl9vcmRlciA9IG9yZGVyZWRfbGV2ZWxzLA0KICAgICAgICAjcm93X3NwbGl0ID0gZmFjdG9yKHBhc3RlMChzYW1wbGVfbWV0YWRhdGEkc2VnbWVudCwgc2FtcGxlX21ldGFkYXRhJHN0YWdlKSwgbGV2ZWxzID0gYygibGl2ZXJTMSIsICJsaXZlclM0IiwgImxpdmVyUzciLCAic3RvbWFjaFMxIiwgImludGVzdGluZVMxIiwgInN0b21hY2hTNCIsICJBX2ludGVzdGluZVM0IiwgIlBfaW50ZXN0aW5lUzQiLCAic3RvbWFjaFM3IiwgIkFfaW50ZXN0aW5lUzciLCAiUF9pbnRlc3RpbmVTNyIpKSwNCiAgICAgICAgY29sdW1uX3NwbGl0ID0gZmFjdG9yKHNhbXBsZV9tZXRhZGF0YSR0cmVhdG1lbnQsIGxldmVscyA9IGMoIkRNU08iLCAiVDNJT1AiLCAiTVBJIiwgIkNQRiIsICJDUEYuVDNJT1AiKSksDQogICAgICAgICNjbHVzdGVyX3Jvd19zbGljZXMgPSBGQUxTRSwNCiAgICAgICAgY2x1c3Rlcl9jb2x1bW5fc2xpY2VzID0gRkFMU0UsDQogICAgICAgIHJvd190aXRsZSA9IE5VTEwsDQogICAgICAgIHJvd19nYXAgPSB1bml0KDAuNSwgIm1tIiksDQogICAgICAgIGNvbHVtbl9nYXAgPSB1bml0KGMocmVwKDEwLDEpLCByZXAoMiwzKSksICJtbSIpLA0KICAgICAgICAjd2lkdGggPSB1bml0KDgsICJjbSIpLCANCiAgICAgICAgI2hlaWdodCA9IHVuaXQoOCwgImNtIiksDQogICAgICAgIGNvbHVtbl9uYW1lc19ncCA9IGdyaWQ6OmdwYXIoZm9udHNpemUgPSA4KSwNCiAgICAgICAgcm93X25hbWVzX2dwID0gZ3JpZDo6Z3Bhcihmb250c2l6ZSA9IDgpLA0KICAgICAgICB0b3BfYW5ub3RhdGlvbiA9IGNvbEFubiwNCiAgICAgICAgI2xlZnRfYW5ub3RhdGlvbiA9IHJvd0FubiwNCiAgICAgICAgc2hvd19oZWF0bWFwX2xlZ2VuZCA9IFRSVUUsDQogICAgICAgIGJvcmRlciA9IFRSVUUsDQogICAgICAgIGNsdXN0ZXJpbmdfbWV0aG9kX3Jvd3MgPSAnd2FyZC5EMicNCiAgICAgICAgKQ0KDQoNCmxpYnJhcnkoR2V0b3B0TG9uZykgICMgZm9yIHRoZSBmdW5jdGlvbiBxcSgpDQpncm91cF9ibG9ja19hbm5vID0gZnVuY3Rpb24oZ3JvdXAsIGVtcHR5X2Fubm8sIGdwID0gZ3BhcigpLCANCiAgICBsYWJlbCA9IE5VTEwsIGxhYmVsX2dwID0gZ3BhcigpKSB7DQoNCiAgICBzZWVrVmlld3BvcnQocXEoImFubm90YXRpb25fQHtlbXB0eV9hbm5vfV9Ae21pbihncm91cCl9IikpDQogICAgbG9jMSA9IGRldmljZUxvYyh4ID0gdW5pdCgwLCAibnBjIiksIHkgPSB1bml0KDAsICJucGMiKSkNCiAgICBzZWVrVmlld3BvcnQocXEoImFubm90YXRpb25fQHtlbXB0eV9hbm5vfV9Ae21heChncm91cCl9IikpDQogICAgbG9jMiA9IGRldmljZUxvYyh4ID0gdW5pdCgxLCAibnBjIiksIHkgPSB1bml0KDEsICJucGMiKSkNCg0KICAgIHNlZWtWaWV3cG9ydCgiZ2xvYmFsIikNCiAgICBncmlkLnJlY3QobG9jMSR4LCBsb2MxJHksIHdpZHRoID0gbG9jMiR4IC0gbG9jMSR4LCBoZWlnaHQgPSBsb2MyJHkgLSBsb2MxJHksIA0KICAgICAgICBqdXN0ID0gYygibGVmdCIsICJib3R0b20iKSwgZ3AgPSBncCkNCiAgICBpZighaXMubnVsbChsYWJlbCkpIHsNCiAgICAgICAgZ3JpZC50ZXh0KGxhYmVsLCB4ID0gKGxvYzEkeCArIGxvYzIkeCkqMC41LCB5ID0gKGxvYzEkeSArIGxvYzIkeSkqMC41LCBncCA9IGxhYmVsX2dwKQ0KICAgIH0NCn0NCg0KZ3JvdXBfYmxvY2tfYW5ubygxOjEsICJlbXB0eTEiLCBncCA9IGdwYXIoZmlsbCA9ICJncmF5NzAiKSwgbGFiZWwgPSAiRE1TTyIpDQpncm91cF9ibG9ja19hbm5vKDI6MiwgImVtcHR5MSIsIGdwID0gZ3BhcihmaWxsID0gInBhbGVncmVlbjMiKSwgbGFiZWwgPSAiVDMrSU9QIikNCmdyb3VwX2Jsb2NrX2Fubm8oMzozLCAiZW1wdHkxIiwgZ3AgPSBncGFyKGZpbGwgPSAibGlnaHRjb3JhbCIpLCBsYWJlbCA9ICJNUEkiKQ0KZ3JvdXBfYmxvY2tfYW5ubyg0OjQsICJlbXB0eTEiLCBncCA9IGdwYXIoZmlsbCA9ICJsaWdodHNreWJsdWUiKSwgbGFiZWwgPSAiQ1BGIikNCmdyb3VwX2Jsb2NrX2Fubm8oNTo1LCAiZW1wdHkxIiwgZ3AgPSBncGFyKGZpbGwgPSAib3JjaGlkMiIpLCBsYWJlbCA9ICJDUEYrVDMrSU9QIikNCg0KDQpgYGANCg0KIyMjIyMgVG9wIGNvbnRyaWJ1dG9ycyBQQzQgKD8pDQpXZSB3aWxsIGhlcmUgYW5hbHlzZSB0aGUgbWFpbiBnZW5lcyBkcml2aW5nIHNlcGFyYXRpb24gYWxvbmcgUEM0Lg0KYGBge3IsIGVjaG89RkFMU0V9DQojI3Bsb3QgdG9wIDUwIGNvbnRyaWJ1dGluZyBnZW5lcyB0byBQQ0EzIChzdGFnZSkNCiNmaW5kIGxpc3Qgb2YgdG9wICg1MCkgY29udHJpYnV0aW5nIGdlbmVzDQpjb250cmliX2RhdGEgPC0gZnZpel9jb250cmliKFBDQW9iamVjdF90b3AyMDAwLCBjaG9pY2UgPSAidmFyIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4ZXMgPSA0LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9wID0gNTANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQ0KDQojUEMxUEMyX1RPUDUwX2NvbnRyaWJ1dG9ycyA8LSBjb250cmliX2RhdGFbWyJwbG90X2VudiJdXVtbImRhdGFfc3VtIl1dW1sibmFtZSJdXQ0KUEM0X1RPUDUwX2NvbnRyaWJ1dG9ycyA8LSBkYXRhLmZyYW1lKCJnZW5lcyIgPSBzYXBwbHkoY29udHJpYl9kYXRhW1sicGxvdF9lbnYiXV1bWyJkYXRhX3N1bSJdXVtbIm5hbWUiXV0sIGFzLmNoYXJhY3RlciksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb250cmlidXRpb24gdG8gUEMxUEMyIiA9IGNvbnRyaWJfZGF0YVtbInBsb3RfZW52Il1dW1siZGF0YV9zdW0iXV1bWyJjb250cmliIl1dKQ0KI2FkZCBhIGNvbHVtbiB3aXRoIHRoZSBvcmlnaW5hbCBlbnNlbWJsX2dlbmVfaWRzDQpQQzRfVE9QNTBfY29udHJpYnV0b3JzJGVudHJlel9JRCA8LSBlbnRyZXppZDJuYW1lX2NvbnZlcnRlciRlbnRyZXpfSURbbWF0Y2goUEM0X1RPUDUwX2NvbnRyaWJ1dG9ycyRnZW5lcyAsZW50cmV6aWQybmFtZV9jb252ZXJ0ZXIkdW5pcXVlX2Rlc2NyaXB0aW9uKV0gDQojYWRkIGEgY29sdW1uIHdpdGggdGhlIGVuc2VtYmwgZGVzY3JpcHRpb24NClBDNF9UT1A1MF9jb250cmlidXRvcnMkZW5zZW1ibF9kZXNjcmlwdGlvbiA8LSBhbm5vdGF0aW9uX2luZm8kZW5zZW1ibF9kZXNjcmlwdGlvblttYXRjaChQQzRfVE9QNTBfY29udHJpYnV0b3JzJGVudHJlel9JRCAsYW5ub3RhdGlvbl9pbmZvJGVudHJlel9JRCldIA0KI3JlYXJyYW5nZSBjb2x1bW4gb3JkZXINClBDNF9UT1A1MF9jb250cmlidXRvcnMgPC0gUEM0X1RPUDUwX2NvbnRyaWJ1dG9yc1ssYygzLDEsNCwyKV0NCg0KI2xpc3QgdG9wIGNvbnRyaWJ1dGluZyBnZW5lcw0KI2thYmxlKFBDNF9UT1A1MF9jb250cmlidXRvcnMsIGNhcHRpb24gPSAiVG9wNTAgZ2VuZXMgZHJpdmluZyBQQzQgc2VwYXJhdGlvbiIpDQoNCiNzYXZlIGRhdGFmcmFtZSBmb3IgbWFudWFsIGFubm90YXRpb24NCiN3cml0ZS5jc3YoUEMxUEMyX1RPUDUwX2NvbnRyaWJ1dG9ycywiQzovL1VzZXJzL0RvY3Rvci9EZXNrdG9wL1JOQXNlcV9hbmFseXNlcy9Bb2NlbGxhcmlzX21ldGFtb3JwaG9zaXMvU2F2ZWRfb2JqZWN0cy9QQzFQQzJfVE9QNTBfY29udHJpYnV0b3JzX29uVG9wMTAwMHZhcmlhbnRnZW5lcy5jc3YiLHJvdy5uYW1lcyA9IEZBTFNFKQ0KDQoNCiMjIEZvcm1hdHRhYmxlIG91dHB1dA0KDQpmb3JtYXR0YWJsZShQQzRfVE9QNTBfY29udHJpYnV0b3JzLCANCiAgICAgICAgICAgICBjYXB0aW9uID0iVG9wNTAgZ2VuZXMgZHJpdmluZyBQQzEgc2VwYXJhdGlvbiIsDQogICAgICAgICAgICBhbGlnbiA9YygiYyIsImwiLCAibCIsICJjIiksIA0KICAgICAgICAgICAgbGlzdChgZW50cmV6X0lEYCA9IGZvcm1hdHRlcigic3BhbiIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZSA9IHggfiBzdHlsZSgNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvciA9ICIjQTlBOUE5IiwgZm9udC53ZWlnaHQgPSAiYm9sZCIpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksIA0KICAgICAgICAgICAgICAgICBgY29udHJpYnV0aW9uLnRvLlBDMVBDMmA9IGNvbG9yX3RpbGUoTkEsImxpZ2h0Y29yYWwiKQ0KDQogICAgICAgICAgICAgICAgICkNCiAgICAgICAgICAgICkNCg0KI3JlbW92ZWQgdW51c2VkIHZhcmlhYmxlcw0Kcm0oY29udHJpYl9kYXRhKQ0KYGBgDQoNCkJlbG93LCB0aGUgcmVsYXRpdmUgZXhwcmVzc2lvbiBsZXZlbCBvZiBlYWNoIGdlbmUNCg0KYGBge3IsIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD02MCwgZWNobz1GQUxTRX0NCiNodHRwOi8vYWdyb25pbmZvdGVjaC5ibG9nc3BvdC5jb20vMjAyMC8wNi9iaXBsb3QtZm9yLXBjcy11c2luZy1iYXNlLWdyYXBoaWMuaHRtbA0KIyB3ZSBjYW4gbm93IHZlcmlmeSBob3cgdGhlc2UgdG9wIDUwIGdlbmVzIGFjdHVhbGx5IG1vdmUgb3VyIHNhbXBsZXMgYWNyb3NzIGRpbWVuc2lvbnMNCiMgZGVmaW5lIHBhbGV0dGUNCm15cGFsZXR0ZSA8LSBicmV3ZXIucGFsKDksIlJkQnUiKSAjZnVuY3Rpb24uIOKAnFJkWWxCdeKAnSBpcyBhIGNvbW1vbiBjaG9pY2UsIGFuZCDigJxTcGVjdHJhbOKAnSBpcyBhbHNvIG5pY2UuDQptb3JlY29scyA8LSBjb2xvclJhbXBQYWxldHRlKG15cGFsZXR0ZSkNCmNvbG9ycmFuZ2U9cmV2KG1vcmVjb2xzKDEwMCkpDQoNCiNzZXQgcm93cyBhbmQgY29sdW1ucyAoNCkNCnBhcihtZnJvdz1jKChsZW5ndGgodW5saXN0KFBDNF9UT1A1MF9jb250cmlidXRvcnNbImdlbmVzIl0pKS8zKSsxLDMpKQ0KDQojcGxvdCBsb29wDQpmb3IgKGkgaW4gMTpsZW5ndGgodW5saXN0KFBDNF9UT1A1MF9jb250cmlidXRvcnNbImdlbmVzIl0pKSkgew0KICBnZW5lX29mX2ludGVyZXN0IDwtIHVubGlzdChQQzRfVE9QNTBfY29udHJpYnV0b3JzWyJnZW5lcyJdKVtpXQ0KICANCiAgI25vcm1hbGlzZSB2YWx1ZXMgb2YgZXhwcmVzc2lvbiBmb3IgZ2VuZSBYIChlLmcgaGJhZTUpDQogICNjb2xvcnZhbHVlcyA8LSAxMDAqKGNvdW50c19WU1RfdG9wMTAwMF90cmFuc3Bvc2VkWyxnZW5lX29mX2ludGVyZXN0XSthYnMobWluKGNvdW50c19WU1RfdG9wMTAwMF90cmFuc3Bvc2VkWyxnZW5lX29mX2ludGVyZXN0XSkpKS8obWF4KGNvdW50c19WU1RfdG9wMTAwMF90cmFuc3Bvc2VkWyxnZW5lX29mX2ludGVyZXN0XSthYnMobWluKGNvdW50c19WU1RfdG9wMTAwMF90cmFuc3Bvc2VkWyxnZW5lX29mX2ludGVyZXN0XSkpKSkgI3RyYW5zcG9zZSBhbGwgdmFsdWVzIGFib3ZlIDAgYnkgYWRkaW5nIG1pbmltYWwgdmFsdWUgKGNvdWxkIGJlIG5lZ2F0aXZlKSB0byBhbGwuIFRoZSBub3JtYWxpc2VkIGJ5IG1heCBpbnRlbnNpdHkgdG8gMS4gVGhlbiBvbiAxMDAgc2NhbGUNCiAgY29sb3J2YWx1ZXMgPC0gMTAwKihjb3VudHNfVlNUX3RvcDIwMDBfdHJhbnNwb3NlZFssZ2VuZV9vZl9pbnRlcmVzdF0pLyhtYXgoY291bnRzX1ZTVF90b3AyMDAwX3RyYW5zcG9zZWRbLGdlbmVfb2ZfaW50ZXJlc3RdKSkNCiAgDQogIA0KICAjY29sb3IgZGF0YXBvaW50cyAob2JzZXJ2YXRpb25zKSBieSBleHByZXNzaW9uIGxldmVsDQogIHBhcihwdHkgPSAicyIsDQogICAgY2V4Lm1haW4gPSAxLjIsDQogICAgY2V4LmxhYiA9IDEsDQogICAgZm9udC5tYWluID0gMiwNCiAgICBmb250LmxhYiA9IDIsDQogICAgZmFtaWx5ID0gInNhbnMiLA0KICAgIGNvbC5tYWluID0gImdyYXkxMCIsDQogICAgY29sLmxhYiA9ICJncmF5MTAiLA0KICAgIGZnID0gImdyYXkxMCIsDQogICAgbGFzID0gMSkNCiAgDQogIHBsb3QubmV3KCkNCiAgDQogICN3ZSBhcmUgZmlyc3QgZ29pbmcgdG8gcGxvdCB0aGUgZGlmZmVyZW50IGNvbmRpdGlvbnMgKHNhbXBsZXMpLCB3aGljaCBhcmUgaW4gUENBb2JqZWN0X3RvcDIwMDAkeCANCiAgcGxvdC53aW5kb3coeGxpbSA9IGV4dGVuZHJhbmdlKHJhbmdlKFBDQW9iamVjdF90b3AyMDAwJHhbLCAzXSksIGYgPSAwLjEpLCAjUENBIG9uIHggYXhpcw0KICAgICAgICAgICAgeWxpbSA9IGV4dGVuZHJhbmdlKHJhbmdlKFBDQW9iamVjdF90b3AyMDAwJHhbLCA0XSksIGYgPSAwLjEpLCAjUENBIG9uIHkgYXhpcw0KICAgICAgICAgICAgYXNwID0gMSkNCiAgYXhpcyhzaWRlID0gMSwgDQogICAgIGxhYmVscyA9IFRSVUUpDQogIGF4aXMoc2lkZSA9IDIsIA0KICAgICBsYWJlbHMgPSBUUlVFKQ0KICB0aXRsZShtYWluID0gZ2VuZV9vZl9pbnRlcmVzdCwNCiAgICAgICAgeGxhYiA9IHBhc3RlKCJQQyAzICgiLCANCiAgICAgICAgICAgICAgICAgICByb3VuZChzdW1tYXJ5KFBDQW9iamVjdF90b3AyMDAwKSRpbXBvcnRhbmNlWzhdKjEwMCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgZGlnaXRzID0gMSksDQogICAgICAgICAgICAgICAgICAgIiUpIiwgDQogICAgICAgICAgICAgICAgICAgc2VwID0gIiIpLCANCiAgICAgIHlsYWIgPSBwYXN0ZSgiUEMgNCAoIiwgDQogICAgICAgICAgICAgICAgICAgcm91bmQoc3VtbWFyeShQQ0FvYmplY3RfdG9wMjAwMCkkaW1wb3J0YW5jZVsxMV0qMTAwLCANCiAgICAgICAgICAgICAgICAgICAgICAgICBkaWdpdHMgPSAxKSwNCiAgICAgICAgICAgICAgICAgICAiJSkiLCANCiAgICAgICAgICAgICAgICAgICBzZXAgPSAiIiksIA0KICAgICAgI2xpbmUgPSAyLA0KICAgICAgYWRqID0gMC41KQ0KICANCiAgIyBwbG90IHRoZSBkaWZmZXJlbnQgY29uZGl0aW9ucyAoc2FtcGxlcykNCiAgcG9pbnRzKHggPSBQQ0FvYmplY3RfdG9wMjAwMCR4WywzOjRdLA0KICAgICAgIHBjaCA9IDE2LA0KICAgICAgIGNleCA9IDIsDQogICAgICAgY29sID0gY29sb3JyYW5nZVtjb2xvcnZhbHVlc10NCiAgICAgICAjY29sID0gcmVwKGMoImJsYWNrIiwiZ3JheTUwIiwgImdyYXkzNSIpLGVhY2g9NykNCiAgICAgICApDQogIA0KICAjdGV4dChQQ0FvYmplY3RfdG9wMjAwMCR4WywzOjRdLTUsIA0KICAjICAgICBsYWJlbHMgPSByb3cubmFtZXMoUENBb2JqZWN0X3RvcDIwMDAkeCksIA0KICAjICAgICBjZXggPSAwLjgsDQogICMgICAgIGZvbnQgPSAyLA0KICAjICAgICBjb2wgPSAiYmxhY2siDQogICMgICAgICkNCiAgDQogIA0KfQ0KDQojcmVtb3ZlIHVudXNlZCB2YXJpYWJsZXMNCnJtKGNvbG9ycmFuZ2UsIGNvbG9ydmFsdWVzLCBnZW5lX29mX2ludGVyZXN0LCBpLCBteXBhbGV0dGUsIG1vcmVjb2xzKQ0KYGBgDQoNCg0KDQojIyMjIyBUb3AgY29udHJpYnV0b3JzIFBDNSAocHJlL3Bvc3QgbWV0YW1vcnBob3Npcz8pDQpXZSB3aWxsIGhlcmUgYW5hbHlzZSB0aGUgbWFpbiBnZW5lcyBkcml2aW5nIHNlcGFyYXRpb24gYWxvbmcgUEM1Lg0KYGBge3IsIGVjaG89RkFMU0V9DQojI3Bsb3QgdG9wIDUwIGNvbnRyaWJ1dGluZyBnZW5lcyB0byBQQ0EzIChzdGFnZSkNCiNmaW5kIGxpc3Qgb2YgdG9wICg1MCkgY29udHJpYnV0aW5nIGdlbmVzDQpjb250cmliX2RhdGEgPC0gZnZpel9jb250cmliKFBDQW9iamVjdF90b3AyMDAwLCBjaG9pY2UgPSAidmFyIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4ZXMgPSA1LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9wID0gNTANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQ0KDQojUEMxUEMyX1RPUDUwX2NvbnRyaWJ1dG9ycyA8LSBjb250cmliX2RhdGFbWyJwbG90X2VudiJdXVtbImRhdGFfc3VtIl1dW1sibmFtZSJdXQ0KUEM1X1RPUDUwX2NvbnRyaWJ1dG9ycyA8LSBkYXRhLmZyYW1lKCJnZW5lcyIgPSBzYXBwbHkoY29udHJpYl9kYXRhW1sicGxvdF9lbnYiXV1bWyJkYXRhX3N1bSJdXVtbIm5hbWUiXV0sIGFzLmNoYXJhY3RlciksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb250cmlidXRpb24gdG8gUEMxUEMyIiA9IGNvbnRyaWJfZGF0YVtbInBsb3RfZW52Il1dW1siZGF0YV9zdW0iXV1bWyJjb250cmliIl1dKQ0KI2FkZCBhIGNvbHVtbiB3aXRoIHRoZSBvcmlnaW5hbCBlbnNlbWJsX2dlbmVfaWRzDQpQQzVfVE9QNTBfY29udHJpYnV0b3JzJGVudHJlel9JRCA8LSBlbnRyZXppZDJuYW1lX2NvbnZlcnRlciRlbnRyZXpfSURbbWF0Y2goUEM1X1RPUDUwX2NvbnRyaWJ1dG9ycyRnZW5lcyAsZW50cmV6aWQybmFtZV9jb252ZXJ0ZXIkdW5pcXVlX2Rlc2NyaXB0aW9uKV0gDQojYWRkIGEgY29sdW1uIHdpdGggdGhlIGVuc2VtYmwgZGVzY3JpcHRpb24NClBDNV9UT1A1MF9jb250cmlidXRvcnMkZW5zZW1ibF9kZXNjcmlwdGlvbiA8LSBhbm5vdGF0aW9uX2luZm8kZW5zZW1ibF9kZXNjcmlwdGlvblttYXRjaChQQzVfVE9QNTBfY29udHJpYnV0b3JzJGVudHJlel9JRCAsYW5ub3RhdGlvbl9pbmZvJGVudHJlel9JRCldIA0KI3JlYXJyYW5nZSBjb2x1bW4gb3JkZXINClBDNV9UT1A1MF9jb250cmlidXRvcnMgPC0gUEM1X1RPUDUwX2NvbnRyaWJ1dG9yc1ssYygzLDEsNCwyKV0NCg0KI2xpc3QgdG9wIGNvbnRyaWJ1dGluZyBnZW5lcw0KI2thYmxlKFBDNV9UT1A1MF9jb250cmlidXRvcnMsIGNhcHRpb24gPSAiVG9wNTAgZ2VuZXMgZHJpdmluZyBQQzQgc2VwYXJhdGlvbiIpDQoNCiNzYXZlIGRhdGFmcmFtZSBmb3IgbWFudWFsIGFubm90YXRpb24NCiN3cml0ZS5jc3YoUEMxUEMyX1RPUDUwX2NvbnRyaWJ1dG9ycywiQzovL1VzZXJzL0RvY3Rvci9EZXNrdG9wL1JOQXNlcV9hbmFseXNlcy9Bb2NlbGxhcmlzX21ldGFtb3JwaG9zaXMvU2F2ZWRfb2JqZWN0cy9QQzFQQzJfVE9QNTBfY29udHJpYnV0b3JzX29uVG9wMTAwMHZhcmlhbnRnZW5lcy5jc3YiLHJvdy5uYW1lcyA9IEZBTFNFKQ0KDQpmb3JtYXR0YWJsZShQQzVfVE9QNTBfY29udHJpYnV0b3JzLCANCiAgICAgICAgICAgICBjYXB0aW9uID0iVG9wNTAgZ2VuZXMgZHJpdmluZyBQQzEgc2VwYXJhdGlvbiIsDQogICAgICAgICAgICBhbGlnbiA9YygiYyIsImwiLCAibCIsICJjIiksIA0KICAgICAgICAgICAgbGlzdChgZW50cmV6X0lEYCA9IGZvcm1hdHRlcigic3BhbiIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZSA9IHggfiBzdHlsZSgNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvciA9ICIjQTlBOUE5IiwgZm9udC53ZWlnaHQgPSAiYm9sZCIpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksIA0KICAgICAgICAgICAgICAgICBgY29udHJpYnV0aW9uLnRvLlBDMVBDMmA9IGNvbG9yX3RpbGUoTkEsImxpZ2h0Y29yYWwiKQ0KDQogICAgICAgICAgICAgICAgICkNCiAgICAgICAgICAgICkNCg0KI3JlbW92ZWQgdW51c2VkIHZhcmlhYmxlcw0Kcm0oY29udHJpYl9kYXRhKQ0KYGBgDQoNCkJlbG93LCB0aGUgcmVsYXRpdmUgZXhwcmVzc2lvbiBsZXZlbCBvZiBlYWNoIGdlbmU6DQoNCmBgYHtyLCBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9NjAsIGVjaG89RkFMU0V9DQojaHR0cDovL2Fncm9uaW5mb3RlY2guYmxvZ3Nwb3QuY29tLzIwMjAvMDYvYmlwbG90LWZvci1wY3MtdXNpbmctYmFzZS1ncmFwaGljLmh0bWwNCiMgd2UgY2FuIG5vdyB2ZXJpZnkgaG93IHRoZXNlIHRvcCA1MCBnZW5lcyBhY3R1YWxseSBtb3ZlIG91ciBzYW1wbGVzIGFjcm9zcyBkaW1lbnNpb25zDQojIGRlZmluZSBwYWxldHRlDQpteXBhbGV0dGUgPC0gYnJld2VyLnBhbCg5LCJSZEJ1IikgI2Z1bmN0aW9uLiDigJxSZFlsQnXigJ0gaXMgYSBjb21tb24gY2hvaWNlLCBhbmQg4oCcU3BlY3RyYWzigJ0gaXMgYWxzbyBuaWNlLg0KbW9yZWNvbHMgPC0gY29sb3JSYW1wUGFsZXR0ZShteXBhbGV0dGUpDQpjb2xvcnJhbmdlPXJldihtb3JlY29scygxMDApKQ0KDQojc2V0IHJvd3MgYW5kIGNvbHVtbnMgKDQpDQpwYXIobWZyb3c9YygobGVuZ3RoKHVubGlzdChQQzVfVE9QNTBfY29udHJpYnV0b3JzWyJnZW5lcyJdKSkvMykrMSwzKSkNCg0KI3Bsb3QgbG9vcA0KZm9yIChpIGluIDE6bGVuZ3RoKHVubGlzdChQQzVfVE9QNTBfY29udHJpYnV0b3JzWyJnZW5lcyJdKSkpIHsNCiAgZ2VuZV9vZl9pbnRlcmVzdCA8LSB1bmxpc3QoUEM1X1RPUDUwX2NvbnRyaWJ1dG9yc1siZ2VuZXMiXSlbaV0NCiAgDQogICNub3JtYWxpc2UgdmFsdWVzIG9mIGV4cHJlc3Npb24gZm9yIGdlbmUgWCAoZS5nIGhiYWU1KQ0KICAjY29sb3J2YWx1ZXMgPC0gMTAwKihjb3VudHNfVlNUX3RvcDEwMDBfdHJhbnNwb3NlZFssZ2VuZV9vZl9pbnRlcmVzdF0rYWJzKG1pbihjb3VudHNfVlNUX3RvcDEwMDBfdHJhbnNwb3NlZFssZ2VuZV9vZl9pbnRlcmVzdF0pKSkvKG1heChjb3VudHNfVlNUX3RvcDEwMDBfdHJhbnNwb3NlZFssZ2VuZV9vZl9pbnRlcmVzdF0rYWJzKG1pbihjb3VudHNfVlNUX3RvcDEwMDBfdHJhbnNwb3NlZFssZ2VuZV9vZl9pbnRlcmVzdF0pKSkpICN0cmFuc3Bvc2UgYWxsIHZhbHVlcyBhYm92ZSAwIGJ5IGFkZGluZyBtaW5pbWFsIHZhbHVlIChjb3VsZCBiZSBuZWdhdGl2ZSkgdG8gYWxsLiBUaGUgbm9ybWFsaXNlZCBieSBtYXggaW50ZW5zaXR5IHRvIDEuIFRoZW4gb24gMTAwIHNjYWxlDQogIGNvbG9ydmFsdWVzIDwtIDEwMCooY291bnRzX1ZTVF90b3AyMDAwX3RyYW5zcG9zZWRbLGdlbmVfb2ZfaW50ZXJlc3RdKS8obWF4KGNvdW50c19WU1RfdG9wMjAwMF90cmFuc3Bvc2VkWyxnZW5lX29mX2ludGVyZXN0XSkpDQogIA0KICANCiAgI2NvbG9yIGRhdGFwb2ludHMgKG9ic2VydmF0aW9ucykgYnkgZXhwcmVzc2lvbiBsZXZlbA0KICBwYXIocHR5ID0gInMiLA0KICAgIGNleC5tYWluID0gMS4yLA0KICAgIGNleC5sYWIgPSAxLA0KICAgIGZvbnQubWFpbiA9IDIsDQogICAgZm9udC5sYWIgPSAyLA0KICAgIGZhbWlseSA9ICJzYW5zIiwNCiAgICBjb2wubWFpbiA9ICJncmF5MTAiLA0KICAgIGNvbC5sYWIgPSAiZ3JheTEwIiwNCiAgICBmZyA9ICJncmF5MTAiLA0KICAgIGxhcyA9IDEpDQogIA0KICBwbG90Lm5ldygpDQogIA0KICAjd2UgYXJlIGZpcnN0IGdvaW5nIHRvIHBsb3QgdGhlIGRpZmZlcmVudCBjb25kaXRpb25zIChzYW1wbGVzKSwgd2hpY2ggYXJlIGluIFBDQW9iamVjdF90b3AyMDAwJHggDQogIHBsb3Qud2luZG93KHhsaW0gPSBleHRlbmRyYW5nZShyYW5nZShQQ0FvYmplY3RfdG9wMjAwMCR4WywgNV0pLCBmID0gMC4xKSwgI1BDQSBvbiB4IGF4aXMNCiAgICAgICAgICAgIHlsaW0gPSBleHRlbmRyYW5nZShyYW5nZShQQ0FvYmplY3RfdG9wMjAwMCR4WywgNl0pLCBmID0gMC4xKSwgI1BDQSBvbiB5IGF4aXMNCiAgICAgICAgICAgIGFzcCA9IDEpDQogIGF4aXMoc2lkZSA9IDEsIA0KICAgICBsYWJlbHMgPSBUUlVFKQ0KICBheGlzKHNpZGUgPSAyLCANCiAgICAgbGFiZWxzID0gVFJVRSkNCiAgdGl0bGUobWFpbiA9IGdlbmVfb2ZfaW50ZXJlc3QsDQogICAgICAgIHhsYWIgPSBwYXN0ZSgiUEMgNSAoIiwgDQogICAgICAgICAgICAgICAgICAgcm91bmQoc3VtbWFyeShQQ0FvYmplY3RfdG9wMjAwMCkkaW1wb3J0YW5jZVsxNF0qMTAwLCANCiAgICAgICAgICAgICAgICAgICAgICAgICBkaWdpdHMgPSAxKSwNCiAgICAgICAgICAgICAgICAgICAiJSkiLCANCiAgICAgICAgICAgICAgICAgICBzZXAgPSAiIiksIA0KICAgICAgeWxhYiA9IHBhc3RlKCJQQyA2ICgiLCANCiAgICAgICAgICAgICAgICAgICByb3VuZChzdW1tYXJ5KFBDQW9iamVjdF90b3AyMDAwKSRpbXBvcnRhbmNlWzE3XSoxMDAsIA0KICAgICAgICAgICAgICAgICAgICAgICAgIGRpZ2l0cyA9IDEpLA0KICAgICAgICAgICAgICAgICAgICIlKSIsIA0KICAgICAgICAgICAgICAgICAgIHNlcCA9ICIiKSwgDQogICAgICAjbGluZSA9IDIsDQogICAgICBhZGogPSAwLjUpDQogIA0KICAjIHBsb3QgdGhlIGRpZmZlcmVudCBjb25kaXRpb25zIChzYW1wbGVzKQ0KICBwb2ludHMoeCA9IFBDQW9iamVjdF90b3AyMDAwJHhbLDU6Nl0sDQogICAgICAgcGNoID0gMTYsDQogICAgICAgY2V4ID0gMiwNCiAgICAgICBjb2wgPSBjb2xvcnJhbmdlW2NvbG9ydmFsdWVzXQ0KICAgICAgICNjb2wgPSByZXAoYygiYmxhY2siLCJncmF5NTAiLCAiZ3JheTM1IiksZWFjaD03KQ0KICAgICAgICkNCiAgDQogICN0ZXh0KFBDQW9iamVjdF90b3AyMDAwJHhbLDM6NF0tNSwgDQogICMgICAgIGxhYmVscyA9IHJvdy5uYW1lcyhQQ0FvYmplY3RfdG9wMjAwMCR4KSwgDQogICMgICAgIGNleCA9IDAuOCwNCiAgIyAgICAgZm9udCA9IDIsDQogICMgICAgIGNvbCA9ICJibGFjayINCiAgIyAgICAgKQ0KICANCiAgDQp9DQoNCiNyZW1vdmUgdW51c2VkIHZhcmlhYmxlcw0Kcm0oY29sb3JyYW5nZSwgY29sb3J2YWx1ZXMsIGdlbmVfb2ZfaW50ZXJlc3QsIGksIG15cGFsZXR0ZSwgbW9yZWNvbHMpDQpgYGANCg0KDQoNCiMjIyMjIFRvcCBjb250cmlidXRvcnMgUEM2ICg/KQ0KV2Ugd2lsbCBoZXJlIGFuYWx5c2UgdGhlIG1haW4gZ2VuZXMgZHJpdmluZyBzZXBhcmF0aW9uIGFsb25nIFBDNg0KYGBge3IsIGVjaG89RkFMU0V9DQojI3Bsb3QgdG9wIDUwIGNvbnRyaWJ1dGluZyBnZW5lcyB0byBQQ0EzIChzdGFnZSkNCiNmaW5kIGxpc3Qgb2YgdG9wICg1MCkgY29udHJpYnV0aW5nIGdlbmVzDQpjb250cmliX2RhdGEgPC0gZnZpel9jb250cmliKFBDQW9iamVjdF90b3AyMDAwLCBjaG9pY2UgPSAidmFyIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4ZXMgPSA2LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9wID0gNTANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQ0KDQojUEMxUEMyX1RPUDUwX2NvbnRyaWJ1dG9ycyA8LSBjb250cmliX2RhdGFbWyJwbG90X2VudiJdXVtbImRhdGFfc3VtIl1dW1sibmFtZSJdXQ0KUEM2X1RPUDUwX2NvbnRyaWJ1dG9ycyA8LSBkYXRhLmZyYW1lKCJnZW5lcyIgPSBzYXBwbHkoY29udHJpYl9kYXRhW1sicGxvdF9lbnYiXV1bWyJkYXRhX3N1bSJdXVtbIm5hbWUiXV0sIGFzLmNoYXJhY3RlciksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb250cmlidXRpb24gdG8gUEMxUEMyIiA9IGNvbnRyaWJfZGF0YVtbInBsb3RfZW52Il1dW1siZGF0YV9zdW0iXV1bWyJjb250cmliIl1dKQ0KI2FkZCBhIGNvbHVtbiB3aXRoIHRoZSBvcmlnaW5hbCBlbnNlbWJsX2dlbmVfaWRzDQpQQzZfVE9QNTBfY29udHJpYnV0b3JzJGVudHJlel9JRCA8LSBlbnRyZXppZDJuYW1lX2NvbnZlcnRlciRlbnRyZXpfSURbbWF0Y2goUEM2X1RPUDUwX2NvbnRyaWJ1dG9ycyRnZW5lcyAsZW50cmV6aWQybmFtZV9jb252ZXJ0ZXIkdW5pcXVlX2Rlc2NyaXB0aW9uKV0gDQojYWRkIGEgY29sdW1uIHdpdGggdGhlIGVuc2VtYmwgZGVzY3JpcHRpb24NClBDNl9UT1A1MF9jb250cmlidXRvcnMkZW5zZW1ibF9kZXNjcmlwdGlvbiA8LSBhbm5vdGF0aW9uX2luZm8kZW5zZW1ibF9kZXNjcmlwdGlvblttYXRjaChQQzZfVE9QNTBfY29udHJpYnV0b3JzJGVudHJlel9JRCAsYW5ub3RhdGlvbl9pbmZvJGVudHJlel9JRCldIA0KI3JlYXJyYW5nZSBjb2x1bW4gb3JkZXINClBDNl9UT1A1MF9jb250cmlidXRvcnMgPC0gUEM2X1RPUDUwX2NvbnRyaWJ1dG9yc1ssYygzLDEsNCwyKV0NCg0KI2xpc3QgdG9wIGNvbnRyaWJ1dGluZyBnZW5lcw0KI2thYmxlKFBDNl9UT1A1MF9jb250cmlidXRvcnMsIGNhcHRpb24gPSAiVG9wNTAgZ2VuZXMgZHJpdmluZyBQQzQgc2VwYXJhdGlvbiIpDQoNCiNzYXZlIGRhdGFmcmFtZSBmb3IgbWFudWFsIGFubm90YXRpb24NCiN3cml0ZS5jc3YoUEMxUEMyX1RPUDUwX2NvbnRyaWJ1dG9ycywiQzovL1VzZXJzL0RvY3Rvci9EZXNrdG9wL1JOQXNlcV9hbmFseXNlcy9Bb2NlbGxhcmlzX21ldGFtb3JwaG9zaXMvU2F2ZWRfb2JqZWN0cy9QQzFQQzJfVE9QNTBfY29udHJpYnV0b3JzX29uVG9wMTAwMHZhcmlhbnRnZW5lcy5jc3YiLHJvdy5uYW1lcyA9IEZBTFNFKQ0KDQpmb3JtYXR0YWJsZShQQzZfVE9QNTBfY29udHJpYnV0b3JzLCANCiAgICAgICAgICAgICBjYXB0aW9uID0iVG9wNTAgZ2VuZXMgZHJpdmluZyBQQzEgc2VwYXJhdGlvbiIsDQogICAgICAgICAgICBhbGlnbiA9YygiYyIsImwiLCAibCIsICJjIiksIA0KICAgICAgICAgICAgbGlzdChgZW50cmV6X0lEYCA9IGZvcm1hdHRlcigic3BhbiIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZSA9IHggfiBzdHlsZSgNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvciA9ICIjQTlBOUE5IiwgZm9udC53ZWlnaHQgPSAiYm9sZCIpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksIA0KICAgICAgICAgICAgICAgICBgY29udHJpYnV0aW9uLnRvLlBDMVBDMmA9IGNvbG9yX3RpbGUoTkEsImxpZ2h0Y29yYWwiKQ0KDQogICAgICAgICAgICAgICAgICkNCiAgICAgICAgICAgICkNCg0KDQojcmVtb3ZlZCB1bnVzZWQgdmFyaWFibGVzDQpybShjb250cmliX2RhdGEpDQoNCmBgYA0KDQpCZWxvdywgdGhlIHJlbGF0aXZlIGV4cHJlc3Npb24gbGV2ZWwgb2YgZWFjaCBnZW5lOg0KYGBge3IsIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD02MCwgZWNobz1GQUxTRX0NCiNodHRwOi8vYWdyb25pbmZvdGVjaC5ibG9nc3BvdC5jb20vMjAyMC8wNi9iaXBsb3QtZm9yLXBjcy11c2luZy1iYXNlLWdyYXBoaWMuaHRtbA0KIyB3ZSBjYW4gbm93IHZlcmlmeSBob3cgdGhlc2UgdG9wIDUwIGdlbmVzIGFjdHVhbGx5IG1vdmUgb3VyIHNhbXBsZXMgYWNyb3NzIGRpbWVuc2lvbnMNCiMgZGVmaW5lIHBhbGV0dGUNCm15cGFsZXR0ZSA8LSBicmV3ZXIucGFsKDksIlJkQnUiKSAjZnVuY3Rpb24uIOKAnFJkWWxCdeKAnSBpcyBhIGNvbW1vbiBjaG9pY2UsIGFuZCDigJxTcGVjdHJhbOKAnSBpcyBhbHNvIG5pY2UuDQptb3JlY29scyA8LSBjb2xvclJhbXBQYWxldHRlKG15cGFsZXR0ZSkNCmNvbG9ycmFuZ2U9cmV2KG1vcmVjb2xzKDEwMCkpDQoNCiNzZXQgcm93cyBhbmQgY29sdW1ucyAoNCkNCnBhcihtZnJvdz1jKChsZW5ndGgodW5saXN0KFBDNl9UT1A1MF9jb250cmlidXRvcnNbImdlbmVzIl0pKS8zKSsxLDMpKQ0KDQojcGxvdCBsb29wDQpmb3IgKGkgaW4gMTpsZW5ndGgodW5saXN0KFBDNl9UT1A1MF9jb250cmlidXRvcnNbImdlbmVzIl0pKSkgew0KICBnZW5lX29mX2ludGVyZXN0IDwtIHVubGlzdChQQzZfVE9QNTBfY29udHJpYnV0b3JzWyJnZW5lcyJdKVtpXQ0KICANCiAgI25vcm1hbGlzZSB2YWx1ZXMgb2YgZXhwcmVzc2lvbiBmb3IgZ2VuZSBYIChlLmcgaGJhZTUpDQogICNjb2xvcnZhbHVlcyA8LSAxMDAqKGNvdW50c19WU1RfdG9wMTAwMF90cmFuc3Bvc2VkWyxnZW5lX29mX2ludGVyZXN0XSthYnMobWluKGNvdW50c19WU1RfdG9wMTAwMF90cmFuc3Bvc2VkWyxnZW5lX29mX2ludGVyZXN0XSkpKS8obWF4KGNvdW50c19WU1RfdG9wMTAwMF90cmFuc3Bvc2VkWyxnZW5lX29mX2ludGVyZXN0XSthYnMobWluKGNvdW50c19WU1RfdG9wMTAwMF90cmFuc3Bvc2VkWyxnZW5lX29mX2ludGVyZXN0XSkpKSkgI3RyYW5zcG9zZSBhbGwgdmFsdWVzIGFib3ZlIDAgYnkgYWRkaW5nIG1pbmltYWwgdmFsdWUgKGNvdWxkIGJlIG5lZ2F0aXZlKSB0byBhbGwuIFRoZSBub3JtYWxpc2VkIGJ5IG1heCBpbnRlbnNpdHkgdG8gMS4gVGhlbiBvbiAxMDAgc2NhbGUNCiAgY29sb3J2YWx1ZXMgPC0gMTAwKihjb3VudHNfVlNUX3RvcDIwMDBfdHJhbnNwb3NlZFssZ2VuZV9vZl9pbnRlcmVzdF0pLyhtYXgoY291bnRzX1ZTVF90b3AyMDAwX3RyYW5zcG9zZWRbLGdlbmVfb2ZfaW50ZXJlc3RdKSkNCiAgDQogIA0KICAjY29sb3IgZGF0YXBvaW50cyAob2JzZXJ2YXRpb25zKSBieSBleHByZXNzaW9uIGxldmVsDQogIHBhcihwdHkgPSAicyIsDQogICAgY2V4Lm1haW4gPSAxLjIsDQogICAgY2V4LmxhYiA9IDEsDQogICAgZm9udC5tYWluID0gMiwNCiAgICBmb250LmxhYiA9IDIsDQogICAgZmFtaWx5ID0gInNhbnMiLA0KICAgIGNvbC5tYWluID0gImdyYXkxMCIsDQogICAgY29sLmxhYiA9ICJncmF5MTAiLA0KICAgIGZnID0gImdyYXkxMCIsDQogICAgbGFzID0gMSkNCiAgDQogIHBsb3QubmV3KCkNCiAgDQogICN3ZSBhcmUgZmlyc3QgZ29pbmcgdG8gcGxvdCB0aGUgZGlmZmVyZW50IGNvbmRpdGlvbnMgKHNhbXBsZXMpLCB3aGljaCBhcmUgaW4gUENBb2JqZWN0X3RvcDIwMDAkeCANCiAgcGxvdC53aW5kb3coeGxpbSA9IGV4dGVuZHJhbmdlKHJhbmdlKFBDQW9iamVjdF90b3AyMDAwJHhbLCA1XSksIGYgPSAwLjEpLCAjUENBIG9uIHggYXhpcw0KICAgICAgICAgICAgeWxpbSA9IGV4dGVuZHJhbmdlKHJhbmdlKFBDQW9iamVjdF90b3AyMDAwJHhbLCA2XSksIGYgPSAwLjEpLCAjUENBIG9uIHkgYXhpcw0KICAgICAgICAgICAgYXNwID0gMSkNCiAgYXhpcyhzaWRlID0gMSwgDQogICAgIGxhYmVscyA9IFRSVUUpDQogIGF4aXMoc2lkZSA9IDIsIA0KICAgICBsYWJlbHMgPSBUUlVFKQ0KICB0aXRsZShtYWluID0gZ2VuZV9vZl9pbnRlcmVzdCwNCiAgICAgICAgeGxhYiA9IHBhc3RlKCJQQyA1ICgiLCANCiAgICAgICAgICAgICAgICAgICByb3VuZChzdW1tYXJ5KFBDQW9iamVjdF90b3AyMDAwKSRpbXBvcnRhbmNlWzE0XSoxMDAsIA0KICAgICAgICAgICAgICAgICAgICAgICAgIGRpZ2l0cyA9IDEpLA0KICAgICAgICAgICAgICAgICAgICIlKSIsIA0KICAgICAgICAgICAgICAgICAgIHNlcCA9ICIiKSwgDQogICAgICB5bGFiID0gcGFzdGUoIlBDIDYgKCIsIA0KICAgICAgICAgICAgICAgICAgIHJvdW5kKHN1bW1hcnkoUENBb2JqZWN0X3RvcDIwMDApJGltcG9ydGFuY2VbMTddKjEwMCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgZGlnaXRzID0gMSksDQogICAgICAgICAgICAgICAgICAgIiUpIiwgDQogICAgICAgICAgICAgICAgICAgc2VwID0gIiIpLCANCiAgICAgICNsaW5lID0gMiwNCiAgICAgIGFkaiA9IDAuNSkNCiAgDQogICMgcGxvdCB0aGUgZGlmZmVyZW50IGNvbmRpdGlvbnMgKHNhbXBsZXMpDQogIHBvaW50cyh4ID0gUENBb2JqZWN0X3RvcDIwMDAkeFssNTo2XSwNCiAgICAgICBwY2ggPSAxNiwNCiAgICAgICBjZXggPSAyLA0KICAgICAgIGNvbCA9IGNvbG9ycmFuZ2VbY29sb3J2YWx1ZXNdDQogICAgICAgI2NvbCA9IHJlcChjKCJibGFjayIsImdyYXk1MCIsICJncmF5MzUiKSxlYWNoPTcpDQogICAgICAgKQ0KICANCiAgI3RleHQoUENBb2JqZWN0X3RvcDIwMDAkeFssMzo0XS01LCANCiAgIyAgICAgbGFiZWxzID0gcm93Lm5hbWVzKFBDQW9iamVjdF90b3AyMDAwJHgpLCANCiAgIyAgICAgY2V4ID0gMC44LA0KICAjICAgICBmb250ID0gMiwNCiAgIyAgICAgY29sID0gImJsYWNrIg0KICAjICAgICApDQogIA0KICANCn0NCg0KI3JlbW92ZSB1bnVzZWQgdmFyaWFibGVzDQpybShjb2xvcnJhbmdlLCBjb2xvcnZhbHVlcywgZ2VuZV9vZl9pbnRlcmVzdCwgaSwgbXlwYWxldHRlLCBtb3JlY29scykNCmBgYA0KDQojIyMjIHstfQ0KDQojIyMgSGllcmFyY2hpY2FsIGNsdXN0ZXJpbmcNCg0KIyMjIyB7LnRhYnNldH0NCiMjIyMjIEhpZXJhcmNoaWNhbCBjbHVzdGVyaW5nIG9uIHRoZSB0b3AgMjUwIG1vc3QgdmFyaWFibGUgZ2VuZXMNCg0KYHIgZW1vOjpqaSgibWFnbmlmeWluZyBnbGFzcyB0aWx0ZWQgcmlnaHQiKWAgQW4gYWx0ZXJuYXRpdmUgdG8gUENBICBmb3IgZXhhbWluaW5nIHJlbGF0aW9uc2hpcHMgYmV0d2VlbiBzYW1wbGVzIGlzIHVzaW5nIGhpZXJhcmNoaWNhbCBjbHVzdGVyaW5nLiBIZWF0bWFwcyBhcmUgYSBuaWNlIHZpc3VhbGlzYXRpb24gdG8gZXhhbWluZSBoaWVyYXJjaGljYWwgY2x1c3RlcmluZyBvZiBzYW1wbGVzLiANCg0KYGBge3IsIGVjaG89RkFMU0V9DQojIEVzdGltYXRlIHRoZSB2YXJpYW5jZSBmb3IgZWFjaCByb3cgaW4gb3VyIGNvdW50c19WU1Qgc3RhcnRpbmcgb2JqZWN0DQp2YXJfZ2VuZXMgPC0gYXBwbHkoY291bnRzX1ZTVCwgMSwgdmFyKQ0KIyBHZXQgdGhlIGdlbmUgbmFtZXMgZm9yIHRoZSB0b3AgMTAwIG1vc3QgdmFyaWFibGUgZ2VuZXMNCnRvcDI1MF9nZW5lcyA8LSBuYW1lcyhzb3J0KHZhcl9nZW5lcywgZGVjcmVhc2luZz1UUlVFKSlbMToyNTBdDQojaGVhZChwcmludCkgICN0aGlzIHByb2R1Y2VkIGEgbGlzdCB3aXRoIHRoZSBjb2RlcyBvZiBlYWNoIG9mIHRoZSBtb3N0IHZhcmlhYmxlIGdlbmVzDQojIFN1YnNldCB2c3QgbWF0cml4DQpjb3VudHNfVlNUX3RvcDI1MCA8LSBjb3VudHNfVlNUW3RvcDI1MF9nZW5lcyxdDQoNCnJvd25hbWVzKGNvdW50c19WU1RfdG9wMjUwKSA8LSBhbm5vdGF0aW9uX2luZm8kbWVyZ2VkX2Rlc2NyaXB0aW9uW21hdGNoKHJvd25hbWVzKGNvdW50c19WU1RfdG9wMjUwKSwgYW5ub3RhdGlvbl9pbmZvJGVudHJlel9JRCldDQoNCmBgYA0KDQpgYGB7ciwgZmlnLmhlaWdodD0yNSwgZmlnLndpZHRoPTEwLCBlY2hvPUZBTFNFfQ0KDQojI2RlZmluZSB0aGUgY29sb3JzIGZvciB0aGUgaGVhdG1hcCAoY2F0ZWdvcmljYWwpOiAxIGNvbG9yIGZvciBlYWNoIHNtYWxsZXN0IGV4cGVyaW1lbnRhbCB1bml0IHRoYXQgaXMgYmVpbmcgIGNvbXBhcmVkOyBpLmUuIGhlcmUgdGhlIHRyZWF0bWVudA0KY29sb3JfY2F0ZWdvcmljYWxfaGVhdG1hcCA8LSBjb2xvcl9jYXRlZ29yaWNhbF90cmVhdG1lbnQNCiNuYW1lIHRoaXMgbGlzdCBvZiBjb2xvciB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIG5hbWVzIChub3RlOiB0aGVzZSBhcmUgdGhlIHVuaXF1ZSB2YWx1ZXMgZm9yIHRoYXQgY2F0ZWdvcnkgaW4gdGhlIHNhbXBsZSBtZXRhZGF0YSkNCmNvbG9yX2NhdGVnb3JpY2FsX2hlYXRtYXBfbmFtZWQgPC0gY29sb3JfY2F0ZWdvcmljYWxfaGVhdG1hcA0KbmFtZXMoY29sb3JfY2F0ZWdvcmljYWxfaGVhdG1hcF9uYW1lZCkgPC0gdW5pcXVlKHNhbXBsZV9tZXRhZGF0YSR0cmVhdG1lbnQpDQoNCiNsb2FkIHRoaXMgaW5mb3JtYXRpb24gaW50byB0aGUgaGVhdG1hcA0KY29sQW5uIDwtIEhlYXRtYXBBbm5vdGF0aW9uKCNkZiA9IGRhdGEuZnJhbWUodHJlYXRtZW50ID0gc2FtcGxlX21ldGFkYXRhJHRyZWF0bWVudCksICN0aGUgbmFtZSBvZiB0aGUgY29sdW1uIG5lZWRzIHRvIG1hdGNoIHRoZSBuYW1lIG9mIHRoZSBuYW1lZCBsaXN0DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgI2NvbCA9IGxpc3QoInRyZWF0bWVudCIgPSBjb2xvcl9jYXRlZ29yaWNhbF9oZWF0bWFwX25hbWVkKSwgI3NldCB0aGUgbmFtZSBvZiB0aGUgbmFtZWQgbGlzdCBzbyBpdCBtYXRjaGVzDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgI2Fubm90YXRpb25fd2lkdGggPSB1bml0KGMoMSwgNCksICdjbScpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICNnYXAgPSB1bml0KDEsICdtbScpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd19sZWdlbmQgPSBGQUxTRSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG93X2Fubm90YXRpb25fbmFtZSA9IEZBTFNFLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoID0gJ2NvbCcsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgI2Fsc28gY3JlYXRlIGFuIGVtcHR5IHJvdyBhYm9lIHRoZSBoZWF0bWFwLCB0byBkaXNwbGF5IGFkZGl0aW9uYWwgaW5mbw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtcHR5MSA9IGFubm9fZW1wdHkoYm9yZGVyID0gRkFMU0UsIGhlaWdodD0gdW5pdCg4LCAibW0iKSkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApDQoNCg0KSGVhdG1hcChtYXQgPSB0KHNjYWxlKHQoY291bnRzX1ZTVF90b3AyNTApKSksDQogICAgICAgIG5hbWU9ICJ6LXNjb3JlIiwNCiAgICAgICAgY29sdW1uX3RpdGxlID0gZ3RfcmVuZGVyKA0KICAgICAgICAgICJQYXR0ZXJuIG9mIGV4cHJlc3Npb24gKGFzIDxzcGFuIHN0eWxlPSdjb2xvcjpicm93bjInPioqei1zY29yZXMqKjwvc3Bhbj4pIDxici8+IG9mIHRoZSB0b3AgY29udHJpYnV0b3JzIHRvIFBDIg0KICAgICAgICAgICksDQogICAgICAgIGNvbCA9IHJldihicmV3ZXIucGFsKDExLCJSZEJ1IikpLA0KICAgICAgICBuYV9jb2wgPSAiYmxhY2siLA0KICAgICAgICBjbHVzdGVyX3Jvd3MgPSBULA0KICAgICAgICBzaG93X3Jvd19kZW5kID0gVCwNCiAgICAgICAgI3Jvd19vcmRlciA9IG9yZGVyZWRfbGV2ZWxzLA0KICAgICAgICBjbHVzdGVyX2NvbHVtbnMgPSBGQUxTRSwNCiAgICAgICAgc2hvd19jb2x1bW5fZGVuZCA9IEZBTFNFLA0KICAgICAgICAjY29sdW1uX29yZGVyID0gb3JkZXJlZF9sZXZlbHMsDQogICAgICAgICNyb3dfc3BsaXQgPSBmYWN0b3IocGFzdGUwKHNhbXBsZV9tZXRhZGF0YSRzZWdtZW50LCBzYW1wbGVfbWV0YWRhdGEkc3RhZ2UpLCBsZXZlbHMgPSBjKCJsaXZlclMxIiwgImxpdmVyUzQiLCAibGl2ZXJTNyIsICJzdG9tYWNoUzEiLCAiaW50ZXN0aW5lUzEiLCAic3RvbWFjaFM0IiwgIkFfaW50ZXN0aW5lUzQiLCAiUF9pbnRlc3RpbmVTNCIsICJzdG9tYWNoUzciLCAiQV9pbnRlc3RpbmVTNyIsICJQX2ludGVzdGluZVM3IikpLA0KICAgICAgICBjb2x1bW5fc3BsaXQgPSBmYWN0b3Ioc2FtcGxlX21ldGFkYXRhJHRyZWF0bWVudCwgbGV2ZWxzID0gYygiRE1TTyIsICJUM0lPUCIsICJNUEkiLCAiQ1BGIiwgIkNQRi5UM0lPUCIpKSwNCiAgICAgICAgI2NsdXN0ZXJfcm93X3NsaWNlcyA9IEZBTFNFLA0KICAgICAgICBjbHVzdGVyX2NvbHVtbl9zbGljZXMgPSBGQUxTRSwNCiAgICAgICAgcm93X3RpdGxlID0gTlVMTCwNCiAgICAgICAgcm93X2dhcCA9IHVuaXQoMC41LCAibW0iKSwNCiAgICAgICAgY29sdW1uX2dhcCA9IHVuaXQoYyhyZXAoMTAsMSksIHJlcCgyLDMpKSwgIm1tIiksDQogICAgICAgICN3aWR0aCA9IHVuaXQoOCwgImNtIiksIA0KICAgICAgICAjaGVpZ2h0ID0gdW5pdCg4LCAiY20iKSwNCiAgICAgICAgY29sdW1uX25hbWVzX2dwID0gZ3JpZDo6Z3Bhcihmb250c2l6ZSA9IDgpLA0KICAgICAgICByb3dfbmFtZXNfZ3AgPSBncmlkOjpncGFyKGZvbnRzaXplID0gOCksDQogICAgICAgIHRvcF9hbm5vdGF0aW9uID0gY29sQW5uLA0KICAgICAgICAjbGVmdF9hbm5vdGF0aW9uID0gcm93QW5uLA0KICAgICAgICBzaG93X2hlYXRtYXBfbGVnZW5kID0gVFJVRSwNCiAgICAgICAgYm9yZGVyID0gVFJVRSwNCiAgICAgICAgY2x1c3RlcmluZ19tZXRob2Rfcm93cyA9ICd3YXJkLkQyJw0KICAgICAgICApDQoNCg0KbGlicmFyeShHZXRvcHRMb25nKSAgIyBmb3IgdGhlIGZ1bmN0aW9uIHFxKCkNCmdyb3VwX2Jsb2NrX2Fubm8gPSBmdW5jdGlvbihncm91cCwgZW1wdHlfYW5ubywgZ3AgPSBncGFyKCksIA0KICAgIGxhYmVsID0gTlVMTCwgbGFiZWxfZ3AgPSBncGFyKCkpIHsNCg0KICAgIHNlZWtWaWV3cG9ydChxcSgiYW5ub3RhdGlvbl9Ae2VtcHR5X2Fubm99X0B7bWluKGdyb3VwKX0iKSkNCiAgICBsb2MxID0gZGV2aWNlTG9jKHggPSB1bml0KDAsICJucGMiKSwgeSA9IHVuaXQoMCwgIm5wYyIpKQ0KICAgIHNlZWtWaWV3cG9ydChxcSgiYW5ub3RhdGlvbl9Ae2VtcHR5X2Fubm99X0B7bWF4KGdyb3VwKX0iKSkNCiAgICBsb2MyID0gZGV2aWNlTG9jKHggPSB1bml0KDEsICJucGMiKSwgeSA9IHVuaXQoMSwgIm5wYyIpKQ0KDQogICAgc2Vla1ZpZXdwb3J0KCJnbG9iYWwiKQ0KICAgIGdyaWQucmVjdChsb2MxJHgsIGxvYzEkeSwgd2lkdGggPSBsb2MyJHggLSBsb2MxJHgsIGhlaWdodCA9IGxvYzIkeSAtIGxvYzEkeSwgDQogICAgICAgIGp1c3QgPSBjKCJsZWZ0IiwgImJvdHRvbSIpLCBncCA9IGdwKQ0KICAgIGlmKCFpcy5udWxsKGxhYmVsKSkgew0KICAgICAgICBncmlkLnRleHQobGFiZWwsIHggPSAobG9jMSR4ICsgbG9jMiR4KSowLjUsIHkgPSAobG9jMSR5ICsgbG9jMiR5KSowLjUsIGdwID0gbGFiZWxfZ3ApDQogICAgfQ0KfQ0KDQpncm91cF9ibG9ja19hbm5vKDE6MSwgImVtcHR5MSIsIGdwID0gZ3BhcihmaWxsID0gImdyYXk3MCIpLCBsYWJlbCA9ICJETVNPIikNCmdyb3VwX2Jsb2NrX2Fubm8oMjoyLCAiZW1wdHkxIiwgZ3AgPSBncGFyKGZpbGwgPSAicGFsZWdyZWVuMyIpLCBsYWJlbCA9ICJUMytJT1AiKQ0KZ3JvdXBfYmxvY2tfYW5ubygzOjMsICJlbXB0eTEiLCBncCA9IGdwYXIoZmlsbCA9ICJsaWdodGNvcmFsIiksIGxhYmVsID0gIk1QSSIpDQpncm91cF9ibG9ja19hbm5vKDQ6NCwgImVtcHR5MSIsIGdwID0gZ3BhcihmaWxsID0gImxpZ2h0c2t5Ymx1ZSIpLCBsYWJlbCA9ICJDUEYiKQ0KZ3JvdXBfYmxvY2tfYW5ubyg1OjUsICJlbXB0eTEiLCBncCA9IGdwYXIoZmlsbCA9ICJvcmNoaWQyIiksIGxhYmVsID0gIkNQRitUMytJT1AiKQ0KDQoNCmBgYA0KDQoNCg0KIyMjIyMgVGh5cm9pZCBzaWduYWxsaW5nDQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KI2xvYWQgdGhlIGNvdW50c19WU1Qgb2JqZWN0DQpsb2FkKCJEOi8vQW9jZWxsYXJpc19DUEZfTVBJX1QzL1NhdmVkX29iamVjdHMvY291bnRzX1ZTVC5yZHMiKQ0KYGBgDQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KI3NlbGVjdCBnZW5lcw0KDQoNCg0KZ2VuZWxpc3QgPC0gYygiMTExNTgzOTEzIiwgI2RpbzENCiAgICAgICAgICAgICAgIjExMTU2MzYzMyIsICNkaW8yDQogICAgICAgICAgICAgICIxMTE1ODYxODUiLCAiMTExNTczNzk5IiwgI2RpbzMNCiAgICAgICAgICAgICAgIjExMTU4ODEwOSIsICN0aHlyb2dsb2J1bGluDQogICAgICAgICAgICAgICIxMTE1Nzc3MTEiLCAjZHVveA0KICAgICAgICAgICAgICAiMTExNTc3NzA5IiwgI2R1b3gyDQogICAgICAgICAgICAgICIxMTE1NzY1NTciLCAjc2xjNWE1L3Npcy9uaXMNCiAgICAgICAgICAgICAgIjExMTU2NTAzNiIsICNzZWxlbm9jeXN0ZWluZSBseWFzZQ0KICAgICAgICAgICAgICAiMTExNTYyNTgxIiwgI3Rwbw0KICAgICAgICAgICAgICAiMTExNTg1ODMxIiwgI3NsYzE2YTEwDQogICAgICAgICAgICAgICIxMTE1ODA2NzIiLCAjTE9DMTExNTgwNjcyX3NsY28xYzENCiAgICAgICAgICAgICAgIjExMTU4MTI3NSIsICNzbGMzYTJhDQogICAgICAgICAgICAgICIxMTE1NzIzNzEiLCAjc2xjN2ExMQ0KICAgICAgICAgICAgICAiMTExNTc1OTc2IiwgIyBMT0MxMTE1NzU5NzYgdGh5cm9pZCBob3Jtb25lIHJlY2VwdG9yIGFscGhhLjIgKHRocmFiKQ0KICAgICAgICAgICAgICAiMTExNTY2NDE4IiwgI0xPQzExMTU2NjQxOF90aHJhYQ0KICAgICAgICAgICAgICAiMTExNTczMzk5IiwgI3RocmINCiAgICAgICAgICAgICAgIjExMTU2ODM0MyIsICNucjFoNA0KICAgICAgICAgICAgICAiMTExNTg4MTk2IiwgI0xPQzExMTU4ODE5Nl9TTEMxMEExDQogICAgICAgICAgICAgICIxMTE1Njk1NjMiLCAgI3NsYzEwYTENCiAgICAgICAgICAgICAgIjExMTU2NTE4MCIsICNoaGV4DQogICAgICAgICAgICAgICIxMTE1NzA3OTAiLCAja2xmOQ0KICAgICAgICAgICAgICAiMTE4NDcwMzgzIiwgI25reDIuMQ0KICAgICAgICAgICAgICAiMTExNTczODk3IiwgIjExMTU2Nzg0NiIsICNwYXgyDQogICAgICAgICAgICAgICIxMTE1NjczMDkiLCAjcGF4OA0KICAgICAgICAgICAgICAiMTExNTY2NzIwIiwgI21lZDENCiAgICAgICAgICAgICAgIjExMTU2NTQ2MyIsICNuY29hMQ0KICAgICAgICAgICAgICAiMTExNTg3Njg5IiwgI25jb2EyDQogICAgICAgICAgICAgICIxMTE1Nzk5NDAiLCAjbmNvYTMNCiAgICAgICAgICAgICAgIjExMTU3NTIwMyIsICNuY29yMQ0KICAgICAgICAgICAgICAiMTExNTgxOTAzIiwgI25jb3IyDQogICAgICAgICAgICAgICIxMTE1NzEzNjYiLCAjc2xjMTZhMg0KICAgICAgICAgICAgICAiMTExNTc2NTgyIiwgI3NsYzJhMWENCiAgICAgICAgICAgICAgIjExMTU4MDAzNSIgI3NsYzJhMWINCiAgICAgICAgICAgICAgIyIxMTE1Njk2MzIiLCAjdHRyDQogICAgICAgICAgICAgICkNCg0KDQoNCiNhbm5vdGF0aW9uX2luZm9bYW5ub3RhdGlvbl9pbmZvJGVuc2VtYmxfSUQgJWluJSBnZW5lbGlzdCxjKCJlbnNlbWJsX0lEIiwgImVudHJlel9JRCIpXQ0KDQoNCg0Kc2VsZWN0ZWRfZ2VuZXMgPC0gYyhnZW5lbGlzdCkNCg0KDQoNCiN0aGUgc3Vic2V0IGFib3ZlIHdhcyBjaG9zZW4gYmFzZWQgb24gdGhlIGVuc2VtYmxlIGFubm90YXRpb24uIGNvbnZlcnQgdG8gTkNCSQ0KI3NlbGVjdGVkX2dlbmVzIDwtIGFubm90YXRpb25faW5mbyRlbnRyZXpfSURbbWF0Y2goc2VsZWN0ZWRfZ2VuZXMsIGFubm90YXRpb25faW5mbyRlbnNlbWJsX0lEKV0NCg0KDQpgYGANCg0KDQpgYGB7ciwgZWNobz1GQUxTRX0NCiMgUmV0dXJucyB0aGUgbWlzc2luZyBnZW5lczoNCm1pc3NpbmdfZ2VuZXMgPC0gYXMuZGF0YS5mcmFtZShzZXRkaWZmKHNlbGVjdGVkX2dlbmVzLCByb3cubmFtZXMoY291bnRzX1ZTVCkpKSANCmNvbG5hbWVzKG1pc3NpbmdfZ2VuZXMpIDwtICJlbnRyZXpfSUQiDQptaXNzaW5nX2dlbmVzJGRlc2NyaXB0aW9uIDwtIGFubm90YXRpb25faW5mbyRtZXJnZWRfZGVzY3JpcHRpb25bbWF0Y2gobWlzc2luZ19nZW5lcyRlbnRyZXpfSUQsYW5ub3RhdGlvbl9pbmZvJGVudHJlel9JRCldDQojbm8gbWlzc2luZyBnZW5lcw0KDQojIFJldHVybnMgdGhlIGV4aXN0aW5nIGdlbmVzOg0Kc2VsZWN0ZWRfZ2VuZXMgPC0gYXMuZGF0YS5mcmFtZShpbnRlcnNlY3Qoc2VsZWN0ZWRfZ2VuZXMsIHJvdy5uYW1lcyhjb3VudHNfVlNUKSkpDQpjb2xuYW1lcyhzZWxlY3RlZF9nZW5lcykgPC0gImVudHJlel9JRCINCnNlbGVjdGVkX2dlbmVzJGRlc2NyaXB0aW9uIDwtIGFubm90YXRpb25faW5mbyRtZXJnZWRfZGVzY3JpcHRpb25bbWF0Y2goc2VsZWN0ZWRfZ2VuZXMkZW50cmV6X0lELGFubm90YXRpb25faW5mbyRlbnRyZXpfSUQpXQ0KDQojcHJpbnQgbGlzdCBvZiBkaWNhcmRlZCBnZW5lcyAoYmVjYXVzZSBtaXNzaW5nKSBhbmQgb2YgcmV0YWluZWQgZ2VuZXMgKGN1cmF0ZWQgZGlnZXN0aW9uIGdlbmVzLCBwcmVzZW50IGluIHRoZSBkYXRhc2V0KQ0KDQoja2FibGUobWlzc2luZ19nZW5lcywgY2FwdGlvbiA9ICJHZW5lcyBtaXNzaW5nIGZyb20gdGhlIGRhdGFzZXQgKGlnbm9yZWQpIikNCmthYmxlKHNlbGVjdGVkX2dlbmVzLCBjYXB0aW9uID0gIkdlbmVzIHByZXNlbnQgaW4gdGhlIGRhdGFzZXQgKHJldGFpbmVkKSIpDQoNCiMjIHN1YnNldCB0aGUgb3JpZ2luYWwgVlNUIG9iamVjdHMgdG8gb25seSBrZWVwIHNlbGVjdGVkIGdlbmVzDQpjb3VudHNfVlNUX3NlbGVjdGVkZ2VuZXMgPC0gc3Vic2V0KGNvdW50c19WU1QsIHJvd25hbWVzKGNvdW50c19WU1QpICVpbiUgc2VsZWN0ZWRfZ2VuZXMkZW50cmV6X0lEKQ0Kcm93bmFtZXMoY291bnRzX1ZTVF9zZWxlY3RlZGdlbmVzKSA8LSBhbm5vdGF0aW9uX2luZm8kbWVyZ2VkX2Rlc2NyaXB0aW9uW21hdGNoKHJvd25hbWVzKGNvdW50c19WU1Rfc2VsZWN0ZWRnZW5lcyksIGFubm90YXRpb25faW5mbyRlbnRyZXpfSUQpXQ0KDQojcmVtb3ZlIHVudXNlZCB2YXJpYWJsZXMNCiNybShzZWxlY3RlZF9nZW5lcykNCg0KYGBgDQoNCmBgYHtyLCBmaWcuaGVpZ2h0PTUsIGZpZy53aWR0aD0xMCwgZWNobz1GQUxTRX0NCg0KIyNkZWZpbmUgdGhlIGNvbG9ycyBmb3IgdGhlIGhlYXRtYXAgKGNhdGVnb3JpY2FsKTogMSBjb2xvciBmb3IgZWFjaCBzbWFsbGVzdCBleHBlcmltZW50YWwgdW5pdCB0aGF0IGlzIGJlaW5nICBjb21wYXJlZDsgaS5lLiBoZXJlIHRoZSB0cmVhdG1lbnQNCmNvbG9yX2NhdGVnb3JpY2FsX2hlYXRtYXAgPC0gY29sb3JfY2F0ZWdvcmljYWxfdHJlYXRtZW50DQojbmFtZSB0aGlzIGxpc3Qgb2YgY29sb3Igd2l0aCB0aGUgY29ycmVzcG9uZGluZyBuYW1lcyAobm90ZTogdGhlc2UgYXJlIHRoZSB1bmlxdWUgdmFsdWVzIGZvciB0aGF0IGNhdGVnb3J5IGluIHRoZSBzYW1wbGUgbWV0YWRhdGEpDQpjb2xvcl9jYXRlZ29yaWNhbF9oZWF0bWFwX25hbWVkIDwtIGNvbG9yX2NhdGVnb3JpY2FsX2hlYXRtYXANCm5hbWVzKGNvbG9yX2NhdGVnb3JpY2FsX2hlYXRtYXBfbmFtZWQpIDwtIHVuaXF1ZShzYW1wbGVfbWV0YWRhdGEkdHJlYXRtZW50KQ0KDQojbG9hZCB0aGlzIGluZm9ybWF0aW9uIGludG8gdGhlIGhlYXRtYXANCmNvbEFubiA8LSBIZWF0bWFwQW5ub3RhdGlvbigjZGYgPSBkYXRhLmZyYW1lKHRyZWF0bWVudCA9IHNhbXBsZV9tZXRhZGF0YSR0cmVhdG1lbnQpLCAjdGhlIG5hbWUgb2YgdGhlIGNvbHVtbiBuZWVkcyB0byBtYXRjaCB0aGUgbmFtZSBvZiB0aGUgbmFtZWQgbGlzdA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICNjb2wgPSBsaXN0KCJ0cmVhdG1lbnQiID0gY29sb3JfY2F0ZWdvcmljYWxfaGVhdG1hcF9uYW1lZCksICNzZXQgdGhlIG5hbWUgb2YgdGhlIG5hbWVkIGxpc3Qgc28gaXQgbWF0Y2hlcw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICNhbm5vdGF0aW9uX3dpZHRoID0gdW5pdChjKDEsIDQpLCAnY20nKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjZ2FwID0gdW5pdCgxLCAnbW0nKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3dfbGVnZW5kID0gRkFMU0UsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd19hbm5vdGF0aW9uX25hbWUgPSBGQUxTRSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGljaCA9ICdjb2wnLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICNhbHNvIGNyZWF0ZSBhbiBlbXB0eSByb3cgYWJvZSB0aGUgaGVhdG1hcCwgdG8gZGlzcGxheSBhZGRpdGlvbmFsIGluZm8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbXB0eTEgPSBhbm5vX2VtcHR5KGJvcmRlciA9IEZBTFNFLCBoZWlnaHQ9IHVuaXQoOCwgIm1tIikpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKQ0KDQoNCkhlYXRtYXAobWF0ID0gdChzY2FsZSh0KGNvdW50c19WU1Rfc2VsZWN0ZWRnZW5lcykpKSwNCiAgICAgICAgbmFtZT0gInotc2NvcmUiLA0KICAgICAgICBjb2x1bW5fdGl0bGUgPSBndF9yZW5kZXIoDQogICAgICAgICAgIlBhdHRlcm4gb2YgZXhwcmVzc2lvbiAoYXMgPHNwYW4gc3R5bGU9J2NvbG9yOmJyb3duMic+Kip6LXNjb3JlcyoqPC9zcGFuPikgPGJyLz4gb2YgVEggc2lnbmFsbGluZyBnZW5lcyINCiAgICAgICAgICApLA0KICAgICAgICBjb2wgPSByZXYoYnJld2VyLnBhbCgxMSwiUmRCdSIpKSwNCiAgICAgICAgbmFfY29sID0gImJsYWNrIiwNCiAgICAgICAgY2x1c3Rlcl9yb3dzID0gVCwNCiAgICAgICAgc2hvd19yb3dfZGVuZCA9IFQsDQogICAgICAgICNyb3dfb3JkZXIgPSBvcmRlcmVkX2xldmVscywNCiAgICAgICAgY2x1c3Rlcl9jb2x1bW5zID0gRkFMU0UsDQogICAgICAgIHNob3dfY29sdW1uX2RlbmQgPSBGQUxTRSwNCiAgICAgICAgI2NvbHVtbl9vcmRlciA9IG9yZGVyZWRfbGV2ZWxzLA0KICAgICAgICAjcm93X3NwbGl0ID0gZmFjdG9yKHBhc3RlMChzYW1wbGVfbWV0YWRhdGEkc2VnbWVudCwgc2FtcGxlX21ldGFkYXRhJHN0YWdlKSwgbGV2ZWxzID0gYygibGl2ZXJTMSIsICJsaXZlclM0IiwgImxpdmVyUzciLCAic3RvbWFjaFMxIiwgImludGVzdGluZVMxIiwgInN0b21hY2hTNCIsICJBX2ludGVzdGluZVM0IiwgIlBfaW50ZXN0aW5lUzQiLCAic3RvbWFjaFM3IiwgIkFfaW50ZXN0aW5lUzciLCAiUF9pbnRlc3RpbmVTNyIpKSwNCiAgICAgICAgY29sdW1uX3NwbGl0ID0gZmFjdG9yKHNhbXBsZV9tZXRhZGF0YSR0cmVhdG1lbnQsIGxldmVscyA9IGMoIkRNU08iLCAiVDNJT1AiLCAiTVBJIiwgIkNQRiIsICJDUEYuVDNJT1AiKSksDQogICAgICAgICNjbHVzdGVyX3Jvd19zbGljZXMgPSBGQUxTRSwNCiAgICAgICAgY2x1c3Rlcl9jb2x1bW5fc2xpY2VzID0gRkFMU0UsDQogICAgICAgIHJvd190aXRsZSA9IE5VTEwsDQogICAgICAgIHJvd19nYXAgPSB1bml0KDAuNSwgIm1tIiksDQogICAgICAgIGNvbHVtbl9nYXAgPSB1bml0KGMocmVwKDEwLDEpLCByZXAoMiwzKSksICJtbSIpLA0KICAgICAgICAjd2lkdGggPSB1bml0KDgsICJjbSIpLCANCiAgICAgICAgI2hlaWdodCA9IHVuaXQoOCwgImNtIiksDQogICAgICAgIGNvbHVtbl9uYW1lc19ncCA9IGdyaWQ6OmdwYXIoZm9udHNpemUgPSA4KSwNCiAgICAgICAgcm93X25hbWVzX2dwID0gZ3JpZDo6Z3Bhcihmb250c2l6ZSA9IDgpLA0KICAgICAgICB0b3BfYW5ub3RhdGlvbiA9IGNvbEFubiwNCiAgICAgICAgI2xlZnRfYW5ub3RhdGlvbiA9IHJvd0FubiwNCiAgICAgICAgc2hvd19oZWF0bWFwX2xlZ2VuZCA9IFRSVUUsDQogICAgICAgIGJvcmRlciA9IFRSVUUsDQogICAgICAgIGNsdXN0ZXJpbmdfbWV0aG9kX3Jvd3MgPSAnd2FyZC5EMicNCiAgICAgICAgKQ0KDQoNCmxpYnJhcnkoR2V0b3B0TG9uZykgICMgZm9yIHRoZSBmdW5jdGlvbiBxcSgpDQpncm91cF9ibG9ja19hbm5vID0gZnVuY3Rpb24oZ3JvdXAsIGVtcHR5X2Fubm8sIGdwID0gZ3BhcigpLCANCiAgICBsYWJlbCA9IE5VTEwsIGxhYmVsX2dwID0gZ3BhcigpKSB7DQoNCiAgICBzZWVrVmlld3BvcnQocXEoImFubm90YXRpb25fQHtlbXB0eV9hbm5vfV9Ae21pbihncm91cCl9IikpDQogICAgbG9jMSA9IGRldmljZUxvYyh4ID0gdW5pdCgwLCAibnBjIiksIHkgPSB1bml0KDAsICJucGMiKSkNCiAgICBzZWVrVmlld3BvcnQocXEoImFubm90YXRpb25fQHtlbXB0eV9hbm5vfV9Ae21heChncm91cCl9IikpDQogICAgbG9jMiA9IGRldmljZUxvYyh4ID0gdW5pdCgxLCAibnBjIiksIHkgPSB1bml0KDEsICJucGMiKSkNCg0KICAgIHNlZWtWaWV3cG9ydCgiZ2xvYmFsIikNCiAgICBncmlkLnJlY3QobG9jMSR4LCBsb2MxJHksIHdpZHRoID0gbG9jMiR4IC0gbG9jMSR4LCBoZWlnaHQgPSBsb2MyJHkgLSBsb2MxJHksIA0KICAgICAgICBqdXN0ID0gYygibGVmdCIsICJib3R0b20iKSwgZ3AgPSBncCkNCiAgICBpZighaXMubnVsbChsYWJlbCkpIHsNCiAgICAgICAgZ3JpZC50ZXh0KGxhYmVsLCB4ID0gKGxvYzEkeCArIGxvYzIkeCkqMC41LCB5ID0gKGxvYzEkeSArIGxvYzIkeSkqMC41LCBncCA9IGxhYmVsX2dwKQ0KICAgIH0NCn0NCg0KZ3JvdXBfYmxvY2tfYW5ubygxOjEsICJlbXB0eTEiLCBncCA9IGdwYXIoZmlsbCA9ICJncmF5NzAiKSwgbGFiZWwgPSAiRE1TTyIpDQpncm91cF9ibG9ja19hbm5vKDI6MiwgImVtcHR5MSIsIGdwID0gZ3BhcihmaWxsID0gInBhbGVncmVlbjMiKSwgbGFiZWwgPSAiVDMrSU9QIikNCmdyb3VwX2Jsb2NrX2Fubm8oMzozLCAiZW1wdHkxIiwgZ3AgPSBncGFyKGZpbGwgPSAibGlnaHRjb3JhbCIpLCBsYWJlbCA9ICJNUEkiKQ0KZ3JvdXBfYmxvY2tfYW5ubyg0OjQsICJlbXB0eTEiLCBncCA9IGdwYXIoZmlsbCA9ICJsaWdodHNreWJsdWUiKSwgbGFiZWwgPSAiQ1BGIikNCmdyb3VwX2Jsb2NrX2Fubm8oNTo1LCAiZW1wdHkxIiwgZ3AgPSBncGFyKGZpbGwgPSAib3JjaGlkMiIpLCBsYWJlbCA9ICJDUEYrVDMrSU9QIikNCg0KDQpgYGANCiMjIyMjIEhQVCBvbmx5DQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KI2xvYWQgdGhlIGNvdW50c19WU1Qgb2JqZWN0DQpsb2FkKCJEOi8vQW9jZWxsYXJpc19DUEZfTVBJX1QzL1NhdmVkX29iamVjdHMvY291bnRzX1ZTVC5yZHMiKQ0KbG9hZCgiRDovL0FvY2VsbGFyaXNfQ1BGX01QSV9UMy9TYXZlZF9vYmplY3RzL3NhbXBsZV9tZXRhZGF0YS5yZHMiKQ0KYGBgDQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KI3NlbGVjdCBnZW5lcw0KDQpnZW5lbGlzdCA8LSBjKCIxMTE1NjkzMzYiLCAjY3JoYQ0KICAgICAgICAgICAgICAiMTExNTcyNDY5IiwgI2NyaGINCiAgICAgICAgICAgICAgIjExMTU3MjY0NSIsIjExMTU2NDY4NiIsICIxMTE1NzUxNDIiLCAjY3JoYnANCiAgICAgICAgICAgICAgIjExMTU3MDQwNSIsICNUUkgNCiAgICAgICAgICAgICAgIjExMTU4NDgzNCIsICNUUkhSYQ0KICAgICAgICAgICAgICAiMTExNTY4OTgzIiwgI1RSSFJiDQogICAgICAgICAgICAgICIxMTE1NzE3MzYiLCAjVFJILURFDQogICAgICAgICAgICAgICIxMTE1NjgwMTEiLCAjVFNIYg0KICAgICAgICAgICAgICAiMTExNTY5MTIwIiAjdHNocg0KICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgKQ0KDQoNCg0KI2Fubm90YXRpb25faW5mb1thbm5vdGF0aW9uX2luZm8kZW5zZW1ibF9JRCAlaW4lIGdlbmVsaXN0LGMoImVuc2VtYmxfSUQiLCAiZW50cmV6X0lEIildDQoNCg0KDQpzZWxlY3RlZF9nZW5lcyA8LSBjKGdlbmVsaXN0KQ0KDQoNCg0KI3RoZSBzdWJzZXQgYWJvdmUgd2FzIGNob3NlbiBiYXNlZCBvbiB0aGUgZW5zZW1ibGUgYW5ub3RhdGlvbi4gY29udmVydCB0byBOQ0JJDQojc2VsZWN0ZWRfZ2VuZXMgPC0gYW5ub3RhdGlvbl9pbmZvJGVudHJlel9JRFttYXRjaChzZWxlY3RlZF9nZW5lcywgYW5ub3RhdGlvbl9pbmZvJGVuc2VtYmxfSUQpXQ0KDQoNCmBgYA0KDQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KbG9hZCgiRDovL0FvY2VsbGFyaXNfQ1BGX01QSV9UMy9TYXZlZF9vYmplY3RzL0NQRl9zaWduaWZpY2FudF9nZW5lcy5yZHMiKQ0KDQpzZWxlY3RlZF9nZW5lcyA8LSBzZWxlY3RlZF9nZW5lc1tzZWxlY3RlZF9nZW5lcyAlaW4lIENQRl9zaWduaWZpY2FudF0gI29ubHkgb25lDQpgYGANCg0KYGBge3IsIGVjaG89RkFMU0V9DQojIFJldHVybnMgdGhlIG1pc3NpbmcgZ2VuZXM6DQptaXNzaW5nX2dlbmVzIDwtIGFzLmRhdGEuZnJhbWUoc2V0ZGlmZihzZWxlY3RlZF9nZW5lcywgcm93Lm5hbWVzKGNvdW50c19WU1QpKSkgDQpjb2xuYW1lcyhtaXNzaW5nX2dlbmVzKSA8LSAiZW50cmV6X0lEIg0KbWlzc2luZ19nZW5lcyRkZXNjcmlwdGlvbiA8LSBhbm5vdGF0aW9uX2luZm8kbWVyZ2VkX2Rlc2NyaXB0aW9uW21hdGNoKG1pc3NpbmdfZ2VuZXMkZW50cmV6X0lELGFubm90YXRpb25faW5mbyRlbnRyZXpfSUQpXQ0KI25vIG1pc3NpbmcgZ2VuZXMNCg0KIyBSZXR1cm5zIHRoZSBleGlzdGluZyBnZW5lczoNCnNlbGVjdGVkX2dlbmVzIDwtIGFzLmRhdGEuZnJhbWUoaW50ZXJzZWN0KHNlbGVjdGVkX2dlbmVzLCByb3cubmFtZXMoY291bnRzX1ZTVCkpKQ0KY29sbmFtZXMoc2VsZWN0ZWRfZ2VuZXMpIDwtICJlbnRyZXpfSUQiDQpzZWxlY3RlZF9nZW5lcyRkZXNjcmlwdGlvbiA8LSBhbm5vdGF0aW9uX2luZm8kbWVyZ2VkX2Rlc2NyaXB0aW9uW21hdGNoKHNlbGVjdGVkX2dlbmVzJGVudHJlel9JRCxhbm5vdGF0aW9uX2luZm8kZW50cmV6X0lEKV0NCg0KI3ByaW50IGxpc3Qgb2YgZGljYXJkZWQgZ2VuZXMgKGJlY2F1c2UgbWlzc2luZykgYW5kIG9mIHJldGFpbmVkIGdlbmVzIChjdXJhdGVkIGRpZ2VzdGlvbiBnZW5lcywgcHJlc2VudCBpbiB0aGUgZGF0YXNldCkNCg0KI2thYmxlKG1pc3NpbmdfZ2VuZXMsIGNhcHRpb24gPSAiR2VuZXMgbWlzc2luZyBmcm9tIHRoZSBkYXRhc2V0IChpZ25vcmVkKSIpDQprYWJsZShzZWxlY3RlZF9nZW5lcywgY2FwdGlvbiA9ICJHZW5lcyBwcmVzZW50IGluIHRoZSBkYXRhc2V0IChyZXRhaW5lZCkiKQ0KDQojIyBzdWJzZXQgdGhlIG9yaWdpbmFsIFZTVCBvYmplY3RzIHRvIG9ubHkga2VlcCBzZWxlY3RlZCBnZW5lcw0KY291bnRzX1ZTVF9zZWxlY3RlZGdlbmVzIDwtIHN1YnNldChjb3VudHNfVlNULCByb3duYW1lcyhjb3VudHNfVlNUKSAlaW4lIHNlbGVjdGVkX2dlbmVzJGVudHJlel9JRCkNCnJvd25hbWVzKGNvdW50c19WU1Rfc2VsZWN0ZWRnZW5lcykgPC0gYW5ub3RhdGlvbl9pbmZvJG1lcmdlZF9kZXNjcmlwdGlvblttYXRjaChyb3duYW1lcyhjb3VudHNfVlNUX3NlbGVjdGVkZ2VuZXMpLCBhbm5vdGF0aW9uX2luZm8kZW50cmV6X0lEKV0NCg0KI3JlbW92ZSB1bnVzZWQgdmFyaWFibGVzDQojcm0oc2VsZWN0ZWRfZ2VuZXMpDQoNCmBgYA0KDQpgYGB7ciwgZmlnLmhlaWdodD0yLjYsIGZpZy53aWR0aD0xMCwgZWNobz1GQUxTRX0NCg0KIyNkZWZpbmUgdGhlIGNvbG9ycyBmb3IgdGhlIGhlYXRtYXAgKGNhdGVnb3JpY2FsKTogMSBjb2xvciBmb3IgZWFjaCBzbWFsbGVzdCBleHBlcmltZW50YWwgdW5pdCB0aGF0IGlzIGJlaW5nICBjb21wYXJlZDsgaS5lLiBoZXJlIHRoZSB0cmVhdG1lbnQNCmNvbG9yX2NhdGVnb3JpY2FsX2hlYXRtYXAgPC0gY29sb3JfY2F0ZWdvcmljYWxfdHJlYXRtZW50DQojbmFtZSB0aGlzIGxpc3Qgb2YgY29sb3Igd2l0aCB0aGUgY29ycmVzcG9uZGluZyBuYW1lcyAobm90ZTogdGhlc2UgYXJlIHRoZSB1bmlxdWUgdmFsdWVzIGZvciB0aGF0IGNhdGVnb3J5IGluIHRoZSBzYW1wbGUgbWV0YWRhdGEpDQpjb2xvcl9jYXRlZ29yaWNhbF9oZWF0bWFwX25hbWVkIDwtIGNvbG9yX2NhdGVnb3JpY2FsX2hlYXRtYXANCm5hbWVzKGNvbG9yX2NhdGVnb3JpY2FsX2hlYXRtYXBfbmFtZWQpIDwtIHVuaXF1ZShzYW1wbGVfbWV0YWRhdGEkdHJlYXRtZW50KQ0KDQojbG9hZCB0aGlzIGluZm9ybWF0aW9uIGludG8gdGhlIGhlYXRtYXANCmNvbEFubiA8LSBIZWF0bWFwQW5ub3RhdGlvbigjZGYgPSBkYXRhLmZyYW1lKHRyZWF0bWVudCA9IHNhbXBsZV9tZXRhZGF0YSR0cmVhdG1lbnQpLCAjdGhlIG5hbWUgb2YgdGhlIGNvbHVtbiBuZWVkcyB0byBtYXRjaCB0aGUgbmFtZSBvZiB0aGUgbmFtZWQgbGlzdA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICNjb2wgPSBsaXN0KCJ0cmVhdG1lbnQiID0gY29sb3JfY2F0ZWdvcmljYWxfaGVhdG1hcF9uYW1lZCksICNzZXQgdGhlIG5hbWUgb2YgdGhlIG5hbWVkIGxpc3Qgc28gaXQgbWF0Y2hlcw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICNhbm5vdGF0aW9uX3dpZHRoID0gdW5pdChjKDEsIDQpLCAnY20nKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjZ2FwID0gdW5pdCgxLCAnbW0nKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3dfbGVnZW5kID0gRkFMU0UsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd19hbm5vdGF0aW9uX25hbWUgPSBGQUxTRSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGljaCA9ICdjb2wnLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICNhbHNvIGNyZWF0ZSBhbiBlbXB0eSByb3cgYWJvZSB0aGUgaGVhdG1hcCwgdG8gZGlzcGxheSBhZGRpdGlvbmFsIGluZm8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbXB0eTEgPSBhbm5vX2VtcHR5KGJvcmRlciA9IEZBTFNFLCBoZWlnaHQ9IHVuaXQoOCwgIm1tIikpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKQ0KDQoNCkhlYXRtYXAobWF0ID0gdChzY2FsZSh0KGNvdW50c19WU1Rfc2VsZWN0ZWRnZW5lcykpKSwNCiAgICAgICAgbmFtZT0gInotc2NvcmUiLA0KICAgICAgICBjb2x1bW5fdGl0bGUgPSBndF9yZW5kZXIoDQogICAgICAgICAgIlBhdHRlcm4gb2YgZXhwcmVzc2lvbiAoYXMgPHNwYW4gc3R5bGU9J2NvbG9yOmJyb3duMic+Kip6LXNjb3JlcyoqPC9zcGFuPikgPGJyLz4gb2YgSFBUIGF4aXMgZ2VuZXMiDQogICAgICAgICAgKSwNCiAgICAgICAgY29sID0gcmV2KGJyZXdlci5wYWwoMTEsIlJkQnUiKSksDQogICAgICAgIG5hX2NvbCA9ICJibGFjayIsDQogICAgICAgIGNsdXN0ZXJfcm93cyA9IFQsDQogICAgICAgIHNob3dfcm93X2RlbmQgPSBULA0KICAgICAgICAjcm93X29yZGVyID0gb3JkZXJlZF9sZXZlbHMsDQogICAgICAgIGNsdXN0ZXJfY29sdW1ucyA9IEZBTFNFLA0KICAgICAgICBzaG93X2NvbHVtbl9kZW5kID0gRkFMU0UsDQogICAgICAgICNjb2x1bW5fb3JkZXIgPSBvcmRlcmVkX2xldmVscywNCiAgICAgICAgI3Jvd19zcGxpdCA9IGZhY3RvcihwYXN0ZTAoc2FtcGxlX21ldGFkYXRhJHNlZ21lbnQsIHNhbXBsZV9tZXRhZGF0YSRzdGFnZSksIGxldmVscyA9IGMoImxpdmVyUzEiLCAibGl2ZXJTNCIsICJsaXZlclM3IiwgInN0b21hY2hTMSIsICJpbnRlc3RpbmVTMSIsICJzdG9tYWNoUzQiLCAiQV9pbnRlc3RpbmVTNCIsICJQX2ludGVzdGluZVM0IiwgInN0b21hY2hTNyIsICJBX2ludGVzdGluZVM3IiwgIlBfaW50ZXN0aW5lUzciKSksDQogICAgICAgIGNvbHVtbl9zcGxpdCA9IGZhY3RvcihzYW1wbGVfbWV0YWRhdGEkdHJlYXRtZW50LCBsZXZlbHMgPSBjKCJETVNPIiwgIlQzSU9QIiwgIk1QSSIsICJDUEYiLCAiQ1BGLlQzSU9QIikpLA0KICAgICAgICAjY2x1c3Rlcl9yb3dfc2xpY2VzID0gRkFMU0UsDQogICAgICAgIGNsdXN0ZXJfY29sdW1uX3NsaWNlcyA9IEZBTFNFLA0KICAgICAgICByb3dfdGl0bGUgPSBOVUxMLA0KICAgICAgICByb3dfZ2FwID0gdW5pdCgwLjUsICJtbSIpLA0KICAgICAgICBjb2x1bW5fZ2FwID0gdW5pdChjKHJlcCgxMCwxKSwgcmVwKDIsMykpLCAibW0iKSwNCiAgICAgICAgI3dpZHRoID0gdW5pdCg4LCAiY20iKSwgDQogICAgICAgICNoZWlnaHQgPSB1bml0KDgsICJjbSIpLA0KICAgICAgICBjb2x1bW5fbmFtZXNfZ3AgPSBncmlkOjpncGFyKGZvbnRzaXplID0gOCksDQogICAgICAgIHJvd19uYW1lc19ncCA9IGdyaWQ6OmdwYXIoZm9udHNpemUgPSA4KSwNCiAgICAgICAgdG9wX2Fubm90YXRpb24gPSBjb2xBbm4sDQogICAgICAgICNsZWZ0X2Fubm90YXRpb24gPSByb3dBbm4sDQogICAgICAgIHNob3dfaGVhdG1hcF9sZWdlbmQgPSBGLA0KICAgICAgICBib3JkZXIgPSBUUlVFLA0KICAgICAgICBjbHVzdGVyaW5nX21ldGhvZF9yb3dzID0gJ3dhcmQuRDInDQogICAgICAgICkNCg0KDQpsaWJyYXJ5KEdldG9wdExvbmcpICAjIGZvciB0aGUgZnVuY3Rpb24gcXEoKQ0KZ3JvdXBfYmxvY2tfYW5ubyA9IGZ1bmN0aW9uKGdyb3VwLCBlbXB0eV9hbm5vLCBncCA9IGdwYXIoKSwgDQogICAgbGFiZWwgPSBOVUxMLCBsYWJlbF9ncCA9IGdwYXIoKSkgew0KDQogICAgc2Vla1ZpZXdwb3J0KHFxKCJhbm5vdGF0aW9uX0B7ZW1wdHlfYW5ub31fQHttaW4oZ3JvdXApfSIpKQ0KICAgIGxvYzEgPSBkZXZpY2VMb2MoeCA9IHVuaXQoMCwgIm5wYyIpLCB5ID0gdW5pdCgwLCAibnBjIikpDQogICAgc2Vla1ZpZXdwb3J0KHFxKCJhbm5vdGF0aW9uX0B7ZW1wdHlfYW5ub31fQHttYXgoZ3JvdXApfSIpKQ0KICAgIGxvYzIgPSBkZXZpY2VMb2MoeCA9IHVuaXQoMSwgIm5wYyIpLCB5ID0gdW5pdCgxLCAibnBjIikpDQoNCiAgICBzZWVrVmlld3BvcnQoImdsb2JhbCIpDQogICAgZ3JpZC5yZWN0KGxvYzEkeCwgbG9jMSR5LCB3aWR0aCA9IGxvYzIkeCAtIGxvYzEkeCwgaGVpZ2h0ID0gbG9jMiR5IC0gbG9jMSR5LCANCiAgICAgICAganVzdCA9IGMoImxlZnQiLCAiYm90dG9tIiksIGdwID0gZ3ApDQogICAgaWYoIWlzLm51bGwobGFiZWwpKSB7DQogICAgICAgIGdyaWQudGV4dChsYWJlbCwgeCA9IChsb2MxJHggKyBsb2MyJHgpKjAuNSwgeSA9IChsb2MxJHkgKyBsb2MyJHkpKjAuNSwgZ3AgPSBsYWJlbF9ncCkNCiAgICB9DQp9DQoNCmdyb3VwX2Jsb2NrX2Fubm8oMToxLCAiZW1wdHkxIiwgZ3AgPSBncGFyKGZpbGwgPSAiZ3JheTcwIiksIGxhYmVsID0gIkRNU08iKQ0KZ3JvdXBfYmxvY2tfYW5ubygyOjIsICJlbXB0eTEiLCBncCA9IGdwYXIoZmlsbCA9ICJwYWxlZ3JlZW4zIiksIGxhYmVsID0gIlQzK0lPUCIpDQpncm91cF9ibG9ja19hbm5vKDM6MywgImVtcHR5MSIsIGdwID0gZ3BhcihmaWxsID0gImxpZ2h0Y29yYWwiKSwgbGFiZWwgPSAiTVBJIikNCmdyb3VwX2Jsb2NrX2Fubm8oNDo0LCAiZW1wdHkxIiwgZ3AgPSBncGFyKGZpbGwgPSAibGlnaHRza3libHVlIiksIGxhYmVsID0gIkNQRiIpDQpncm91cF9ibG9ja19hbm5vKDU6NSwgImVtcHR5MSIsIGdwID0gZ3BhcihmaWxsID0gIm9yY2hpZDIiKSwgbGFiZWwgPSAiQ1BGK1QzK0lPUCIpDQoNCg0KYGBgDQoNCiMjIyMjIEhQSSBheGlzIA0KDQpgYGB7ciwgZWNobz1GQUxTRX0NCiNsb2FkIHRoZSBjb3VudHNfVlNUIG9iamVjdA0KbG9hZCgiRDovL0FvY2VsbGFyaXNfQ1BGX01QSV9UMy9TYXZlZF9vYmplY3RzL2NvdW50c19WU1QucmRzIikNCmxvYWQoIkQ6Ly9Bb2NlbGxhcmlzX0NQRl9NUElfVDMvU2F2ZWRfb2JqZWN0cy9zYW1wbGVfbWV0YWRhdGEucmRzIikNCmBgYA0KDQpgYGB7ciwgZWNobz1GQUxTRX0NCiNzZWxlY3QgZ2VuZXMNCg0KZ2VuZWxpc3QgPC0gYygiMTExNTY5MzM2IiwgI2NyaGENCiAgICAgICAgICAgICAgIjExMTU3MjQ2OSIsICNjcmhiDQogICAgICAgICAgICAgICIxMTE1NzI2NDUiLCIxMTE1NjQ2ODYiLCAiMTExNTc1MTQyIiwgI2NyaGJwDQogICAgICAgICAgICAgICIxMTE1NjgxNzEiLCAjY3JocjFhDQogICAgICAgICAgICAgICIxMTE1ODQzNDciLCAjY3JocjFiDQogICAgICAgICAgICAgICIxMTE1Njg2MjkiLCAjY3JocjINCiAgICAgICAgICAgICAgIjExMTU4MDExOCIsICNwb21jYWENCiAgICAgICAgICAgICAgIjExMTU3NzU2MyIsICNwb21jYWINCiAgICAgICAgICAgICAgIjExMTU4NDY1NiIsICNwb21jYg0KICAgICAgICAgICAgICAiMTExNTcxNDU4IiwgI3VjbjNsDQogICAgICAgICAgICAgICIxMTE1ODkwNjMiLCAjbWMycg0KICAgICAgICAgICAgICAiMTExNTY2NDUwIiAjbXJhcDIgKHdoZXJlIGlzIG1yYXAxKQ0KICAgICAgICAgICAgICApDQoNCg0KDQojYW5ub3RhdGlvbl9pbmZvW2Fubm90YXRpb25faW5mbyRlbnNlbWJsX0lEICVpbiUgZ2VuZWxpc3QsYygiZW5zZW1ibF9JRCIsICJlbnRyZXpfSUQiKV0NCg0KDQoNCnNlbGVjdGVkX2dlbmVzIDwtIGMoZ2VuZWxpc3QpDQoNCg0KDQojdGhlIHN1YnNldCBhYm92ZSB3YXMgY2hvc2VuIGJhc2VkIG9uIHRoZSBlbnNlbWJsZSBhbm5vdGF0aW9uLiBjb252ZXJ0IHRvIE5DQkkNCiNzZWxlY3RlZF9nZW5lcyA8LSBhbm5vdGF0aW9uX2luZm8kZW50cmV6X0lEW21hdGNoKHNlbGVjdGVkX2dlbmVzLCBhbm5vdGF0aW9uX2luZm8kZW5zZW1ibF9JRCldDQoNCg0KYGBgDQoNCg0KYGBge3IsIGVjaG89RkFMU0V9DQpsb2FkKCJEOi8vQW9jZWxsYXJpc19DUEZfTVBJX1QzL1NhdmVkX29iamVjdHMvQ1BGX3NpZ25pZmljYW50X2dlbmVzLnJkcyIpDQoNCnNlbGVjdGVkX2dlbmVzIDwtIHNlbGVjdGVkX2dlbmVzW3NlbGVjdGVkX2dlbmVzICVpbiUgQ1BGX3NpZ25pZmljYW50XSAjb25seSBvbmUNCmBgYA0KDQpgYGB7ciwgZWNobz1GQUxTRX0NCiMgUmV0dXJucyB0aGUgbWlzc2luZyBnZW5lczoNCm1pc3NpbmdfZ2VuZXMgPC0gYXMuZGF0YS5mcmFtZShzZXRkaWZmKHNlbGVjdGVkX2dlbmVzLCByb3cubmFtZXMoY291bnRzX1ZTVCkpKSANCmNvbG5hbWVzKG1pc3NpbmdfZ2VuZXMpIDwtICJlbnRyZXpfSUQiDQptaXNzaW5nX2dlbmVzJGRlc2NyaXB0aW9uIDwtIGFubm90YXRpb25faW5mbyRtZXJnZWRfZGVzY3JpcHRpb25bbWF0Y2gobWlzc2luZ19nZW5lcyRlbnRyZXpfSUQsYW5ub3RhdGlvbl9pbmZvJGVudHJlel9JRCldDQojbm8gbWlzc2luZyBnZW5lcw0KDQojIFJldHVybnMgdGhlIGV4aXN0aW5nIGdlbmVzOg0Kc2VsZWN0ZWRfZ2VuZXMgPC0gYXMuZGF0YS5mcmFtZShpbnRlcnNlY3Qoc2VsZWN0ZWRfZ2VuZXMsIHJvdy5uYW1lcyhjb3VudHNfVlNUKSkpDQpjb2xuYW1lcyhzZWxlY3RlZF9nZW5lcykgPC0gImVudHJlel9JRCINCnNlbGVjdGVkX2dlbmVzJGRlc2NyaXB0aW9uIDwtIGFubm90YXRpb25faW5mbyRtZXJnZWRfZGVzY3JpcHRpb25bbWF0Y2goc2VsZWN0ZWRfZ2VuZXMkZW50cmV6X0lELGFubm90YXRpb25faW5mbyRlbnRyZXpfSUQpXQ0KDQojcHJpbnQgbGlzdCBvZiBkaWNhcmRlZCBnZW5lcyAoYmVjYXVzZSBtaXNzaW5nKSBhbmQgb2YgcmV0YWluZWQgZ2VuZXMgKGN1cmF0ZWQgZGlnZXN0aW9uIGdlbmVzLCBwcmVzZW50IGluIHRoZSBkYXRhc2V0KQ0KDQoja2FibGUobWlzc2luZ19nZW5lcywgY2FwdGlvbiA9ICJHZW5lcyBtaXNzaW5nIGZyb20gdGhlIGRhdGFzZXQgKGlnbm9yZWQpIikNCmthYmxlKHNlbGVjdGVkX2dlbmVzLCBjYXB0aW9uID0gIkdlbmVzIHByZXNlbnQgaW4gdGhlIGRhdGFzZXQgKHJldGFpbmVkKSIpDQoNCiMjIHN1YnNldCB0aGUgb3JpZ2luYWwgVlNUIG9iamVjdHMgdG8gb25seSBrZWVwIHNlbGVjdGVkIGdlbmVzDQpjb3VudHNfVlNUX3NlbGVjdGVkZ2VuZXMgPC0gc3Vic2V0KGNvdW50c19WU1QsIHJvd25hbWVzKGNvdW50c19WU1QpICVpbiUgc2VsZWN0ZWRfZ2VuZXMkZW50cmV6X0lEKQ0Kcm93bmFtZXMoY291bnRzX1ZTVF9zZWxlY3RlZGdlbmVzKSA8LSBhbm5vdGF0aW9uX2luZm8kbWVyZ2VkX2Rlc2NyaXB0aW9uW21hdGNoKHJvd25hbWVzKGNvdW50c19WU1Rfc2VsZWN0ZWRnZW5lcyksIGFubm90YXRpb25faW5mbyRlbnRyZXpfSUQpXQ0KDQojcmVtb3ZlIHVudXNlZCB2YXJpYWJsZXMNCnJtKHNlbGVjdGVkX2dlbmVzKQ0KDQpgYGANCg0KYGBge3IsIGZpZy5oZWlnaHQ9MywgZmlnLndpZHRoPTEwLCBlY2hvPUZBTFNFfQ0KDQojI2RlZmluZSB0aGUgY29sb3JzIGZvciB0aGUgaGVhdG1hcCAoY2F0ZWdvcmljYWwpOiAxIGNvbG9yIGZvciBlYWNoIHNtYWxsZXN0IGV4cGVyaW1lbnRhbCB1bml0IHRoYXQgaXMgYmVpbmcgIGNvbXBhcmVkOyBpLmUuIGhlcmUgdGhlIHRyZWF0bWVudA0KY29sb3JfY2F0ZWdvcmljYWxfaGVhdG1hcCA8LSBjb2xvcl9jYXRlZ29yaWNhbF90cmVhdG1lbnQNCiNuYW1lIHRoaXMgbGlzdCBvZiBjb2xvciB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIG5hbWVzIChub3RlOiB0aGVzZSBhcmUgdGhlIHVuaXF1ZSB2YWx1ZXMgZm9yIHRoYXQgY2F0ZWdvcnkgaW4gdGhlIHNhbXBsZSBtZXRhZGF0YSkNCmNvbG9yX2NhdGVnb3JpY2FsX2hlYXRtYXBfbmFtZWQgPC0gY29sb3JfY2F0ZWdvcmljYWxfaGVhdG1hcA0KbmFtZXMoY29sb3JfY2F0ZWdvcmljYWxfaGVhdG1hcF9uYW1lZCkgPC0gdW5pcXVlKHNhbXBsZV9tZXRhZGF0YSR0cmVhdG1lbnQpDQoNCiNsb2FkIHRoaXMgaW5mb3JtYXRpb24gaW50byB0aGUgaGVhdG1hcA0KY29sQW5uIDwtIEhlYXRtYXBBbm5vdGF0aW9uKCNkZiA9IGRhdGEuZnJhbWUodHJlYXRtZW50ID0gc2FtcGxlX21ldGFkYXRhJHRyZWF0bWVudCksICN0aGUgbmFtZSBvZiB0aGUgY29sdW1uIG5lZWRzIHRvIG1hdGNoIHRoZSBuYW1lIG9mIHRoZSBuYW1lZCBsaXN0DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgI2NvbCA9IGxpc3QoInRyZWF0bWVudCIgPSBjb2xvcl9jYXRlZ29yaWNhbF9oZWF0bWFwX25hbWVkKSwgI3NldCB0aGUgbmFtZSBvZiB0aGUgbmFtZWQgbGlzdCBzbyBpdCBtYXRjaGVzDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgI2Fubm90YXRpb25fd2lkdGggPSB1bml0KGMoMSwgNCksICdjbScpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICNnYXAgPSB1bml0KDEsICdtbScpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd19sZWdlbmQgPSBGQUxTRSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG93X2Fubm90YXRpb25fbmFtZSA9IEZBTFNFLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoID0gJ2NvbCcsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgI2Fsc28gY3JlYXRlIGFuIGVtcHR5IHJvdyBhYm9lIHRoZSBoZWF0bWFwLCB0byBkaXNwbGF5IGFkZGl0aW9uYWwgaW5mbw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtcHR5MSA9IGFubm9fZW1wdHkoYm9yZGVyID0gRkFMU0UsIGhlaWdodD0gdW5pdCg4LCAibW0iKSkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApDQoNCg0KSGVhdG1hcChtYXQgPSB0KHNjYWxlKHQoY291bnRzX1ZTVF9zZWxlY3RlZGdlbmVzKSkpLA0KICAgICAgICBuYW1lPSAiei1zY29yZSIsDQogICAgICAgIGNvbHVtbl90aXRsZSA9IGd0X3JlbmRlcigNCiAgICAgICAgICAiUGF0dGVybiBvZiBleHByZXNzaW9uIChhcyA8c3BhbiBzdHlsZT0nY29sb3I6YnJvd24yJz4qKnotc2NvcmVzKio8L3NwYW4+KSA8YnIvPiBvZiBIUEkgYXhpcyBnZW5lcyINCiAgICAgICAgICApLA0KICAgICAgICBjb2wgPSByZXYoYnJld2VyLnBhbCgxMSwiUmRCdSIpKSwNCiAgICAgICAgbmFfY29sID0gImJsYWNrIiwNCiAgICAgICAgY2x1c3Rlcl9yb3dzID0gVCwNCiAgICAgICAgc2hvd19yb3dfZGVuZCA9IFQsDQogICAgICAgICNyb3dfb3JkZXIgPSBvcmRlcmVkX2xldmVscywNCiAgICAgICAgY2x1c3Rlcl9jb2x1bW5zID0gRkFMU0UsDQogICAgICAgIHNob3dfY29sdW1uX2RlbmQgPSBGQUxTRSwNCiAgICAgICAgI2NvbHVtbl9vcmRlciA9IG9yZGVyZWRfbGV2ZWxzLA0KICAgICAgICAjcm93X3NwbGl0ID0gZmFjdG9yKHBhc3RlMChzYW1wbGVfbWV0YWRhdGEkc2VnbWVudCwgc2FtcGxlX21ldGFkYXRhJHN0YWdlKSwgbGV2ZWxzID0gYygibGl2ZXJTMSIsICJsaXZlclM0IiwgImxpdmVyUzciLCAic3RvbWFjaFMxIiwgImludGVzdGluZVMxIiwgInN0b21hY2hTNCIsICJBX2ludGVzdGluZVM0IiwgIlBfaW50ZXN0aW5lUzQiLCAic3RvbWFjaFM3IiwgIkFfaW50ZXN0aW5lUzciLCAiUF9pbnRlc3RpbmVTNyIpKSwNCiAgICAgICAgY29sdW1uX3NwbGl0ID0gZmFjdG9yKHNhbXBsZV9tZXRhZGF0YSR0cmVhdG1lbnQsIGxldmVscyA9IGMoIkRNU08iLCAiVDNJT1AiLCAiTVBJIiwgIkNQRiIsICJDUEYuVDNJT1AiKSksDQogICAgICAgICNjbHVzdGVyX3Jvd19zbGljZXMgPSBGQUxTRSwNCiAgICAgICAgY2x1c3Rlcl9jb2x1bW5fc2xpY2VzID0gRkFMU0UsDQogICAgICAgIHJvd190aXRsZSA9IE5VTEwsDQogICAgICAgIHJvd19nYXAgPSB1bml0KDAuNSwgIm1tIiksDQogICAgICAgIGNvbHVtbl9nYXAgPSB1bml0KGMocmVwKDEwLDEpLCByZXAoMiwzKSksICJtbSIpLA0KICAgICAgICAjd2lkdGggPSB1bml0KDgsICJjbSIpLCANCiAgICAgICAgI2hlaWdodCA9IHVuaXQoOCwgImNtIiksDQogICAgICAgIGNvbHVtbl9uYW1lc19ncCA9IGdyaWQ6OmdwYXIoZm9udHNpemUgPSA4KSwNCiAgICAgICAgcm93X25hbWVzX2dwID0gZ3JpZDo6Z3Bhcihmb250c2l6ZSA9IDgpLA0KICAgICAgICB0b3BfYW5ub3RhdGlvbiA9IGNvbEFubiwNCiAgICAgICAgI2xlZnRfYW5ub3RhdGlvbiA9IHJvd0FubiwNCiAgICAgICAgc2hvd19oZWF0bWFwX2xlZ2VuZCA9IEYsDQogICAgICAgIGJvcmRlciA9IFRSVUUsDQogICAgICAgIGNsdXN0ZXJpbmdfbWV0aG9kX3Jvd3MgPSAnd2FyZC5EMicNCiAgICAgICAgKQ0KDQoNCmxpYnJhcnkoR2V0b3B0TG9uZykgICMgZm9yIHRoZSBmdW5jdGlvbiBxcSgpDQpncm91cF9ibG9ja19hbm5vID0gZnVuY3Rpb24oZ3JvdXAsIGVtcHR5X2Fubm8sIGdwID0gZ3BhcigpLCANCiAgICBsYWJlbCA9IE5VTEwsIGxhYmVsX2dwID0gZ3BhcigpKSB7DQoNCiAgICBzZWVrVmlld3BvcnQocXEoImFubm90YXRpb25fQHtlbXB0eV9hbm5vfV9Ae21pbihncm91cCl9IikpDQogICAgbG9jMSA9IGRldmljZUxvYyh4ID0gdW5pdCgwLCAibnBjIiksIHkgPSB1bml0KDAsICJucGMiKSkNCiAgICBzZWVrVmlld3BvcnQocXEoImFubm90YXRpb25fQHtlbXB0eV9hbm5vfV9Ae21heChncm91cCl9IikpDQogICAgbG9jMiA9IGRldmljZUxvYyh4ID0gdW5pdCgxLCAibnBjIiksIHkgPSB1bml0KDEsICJucGMiKSkNCg0KICAgIHNlZWtWaWV3cG9ydCgiZ2xvYmFsIikNCiAgICBncmlkLnJlY3QobG9jMSR4LCBsb2MxJHksIHdpZHRoID0gbG9jMiR4IC0gbG9jMSR4LCBoZWlnaHQgPSBsb2MyJHkgLSBsb2MxJHksIA0KICAgICAgICBqdXN0ID0gYygibGVmdCIsICJib3R0b20iKSwgZ3AgPSBncCkNCiAgICBpZighaXMubnVsbChsYWJlbCkpIHsNCiAgICAgICAgZ3JpZC50ZXh0KGxhYmVsLCB4ID0gKGxvYzEkeCArIGxvYzIkeCkqMC41LCB5ID0gKGxvYzEkeSArIGxvYzIkeSkqMC41LCBncCA9IGxhYmVsX2dwKQ0KICAgIH0NCn0NCg0KZ3JvdXBfYmxvY2tfYW5ubygxOjEsICJlbXB0eTEiLCBncCA9IGdwYXIoZmlsbCA9ICJncmF5NzAiKSwgbGFiZWwgPSAiRE1TTyIpDQpncm91cF9ibG9ja19hbm5vKDI6MiwgImVtcHR5MSIsIGdwID0gZ3BhcihmaWxsID0gInBhbGVncmVlbjMiKSwgbGFiZWwgPSAiVDMrSU9QIikNCmdyb3VwX2Jsb2NrX2Fubm8oMzozLCAiZW1wdHkxIiwgZ3AgPSBncGFyKGZpbGwgPSAibGlnaHRjb3JhbCIpLCBsYWJlbCA9ICJNUEkiKQ0KZ3JvdXBfYmxvY2tfYW5ubyg0OjQsICJlbXB0eTEiLCBncCA9IGdwYXIoZmlsbCA9ICJsaWdodHNreWJsdWUiKSwgbGFiZWwgPSAiQ1BGIikNCmdyb3VwX2Jsb2NrX2Fubm8oNTo1LCAiZW1wdHkxIiwgZ3AgPSBncGFyKGZpbGwgPSAib3JjaGlkMiIpLCBsYWJlbCA9ICJDUEYrVDMrSU9QIikNCg0KDQpgYGANCg0KDQoNCiMjIyMjIFBpZ21lbnRhdGlvbi93aGl0ZSBiYW5kcw0KDQpgYGB7ciwgZWNobz1GQUxTRX0NCiNsb2FkIHRoZSBjb3VudHNfVlNUIG9iamVjdA0KbG9hZCgiRDovL0FvY2VsbGFyaXNfQ1BGX01QSV9UMy9TYXZlZF9vYmplY3RzL2NvdW50c19WU1QucmRzIikNCmBgYA0KDQpgYGB7ciwgZWNobz1GQUxTRX0NCiNzZWxlY3QgZ2VuZXMNCg0KZ2VuZWxpc3QgPC0gYygiMTExNTY5MTM5IiwgDQogICAgICAgICAgICAgICIxMTE1NjU1NTAiLCANCiAgICAgICAgICAgICAgIjExMTU2OTUxMyIsIA0KICAgICAgICAgICAgICAiMTExNTcwOTYwIiwgDQogICAgICAgICAgICAgICIxMTE1ODgwODEiLCANCiAgICAgICAgICAgICAgIjExMTU3MjU0NSIsIA0KICAgICAgICAgICAgICAiMTExNTY3OTg3IiwNCiAgICAgICAgICAgICAgIjExMTU2Mzk5OSIsIA0KICAgICAgICAgICAgICAiMTExNTc1NDIwIiwNCiAgICAgICAgICAgICAgIjExMTU4Nzc2NSIsDQogICAgICAgICAgICAgICIxMTE1ODAzMDciLA0KICAgICAgICAgICAgICAiMTExNTg4OTUwIiwNCiAgICAgICAgICAgICAgIjExMTU3OTAzNCIsDQogICAgICAgICAgICAgICIxMTE1NzgxNDIiLA0KICAgICAgICAgICAgICAiMTExNTYzOTk5IiwNCiAgICAgICAgICAgICAgIjExMTU4MjY3MCIsDQogICAgICAgICAgICAgICAiMTExNTc0NDYwIiwNCiAgICAgICAgICAgICAgIjExMTU3NTA4MCIsDQogICAgICAgICAgICAgICIxMTE1NjY0NjciLA0KICAgICAgICAgICAgICAiMTExNTY5NTkxIiwNCiAgICAgICAgICAgICAgICIxMTE1ODI0MjEiLA0KICAgICAgICAgICAgICAiMTExNTczNjU0IiwNCiAgICAgICAgICAgICAgIjExMTU3OTQxMSIsDQogICAgICAgICAgICAgICIxMTE1ODA4MTUiLA0KICAgICAgICAgICAgICAgIjExMTU3MDE1MCIsDQogICAgICAgICAgICAgICIxMTE1NzE2MDkiLA0KICAgICAgICAgICAgICAiMTExNTc5NDEyIiwNCiAgICAgICAgICAgICAgIjExMTU4OTE0MSIsDQogICAgICAgICAgICAgICAiMTExNTY0NzU3IiwNCiAgICAgICAgICAgICAgIjExMTU4MDY5NCIsDQogICAgICAgICAgICAgICIxMTE1NjgyOTYiLA0KICAgICAgICAgICAgICAiMTExNTcyNTcwIiwNCiAgICAgICAgICAgICAgICIxMTE1NjYzMTQiLA0KICAgICAgICAgICAgICAiMTExNTg3MjcwIiwNCiAgICAgICAgICAgICAgIjExMTU3NzcwOSIsDQogICAgICAgICAgICAgICIxMTE1Nzc3MTEiLA0KICAgICAgICAgICAgICAiMTExNTc3OTQwIg0KICAgICAgICAgICAgICApDQoNCg0KDQoNCg0KI2Fubm90YXRpb25faW5mb1thbm5vdGF0aW9uX2luZm8kZW5zZW1ibF9JRCAlaW4lIGdlbmVsaXN0LGMoImVuc2VtYmxfSUQiLCAiZW50cmV6X0lEIildDQoNCg0KDQpzZWxlY3RlZF9nZW5lcyA8LSBjKGdlbmVsaXN0KQ0KDQoNCg0KI3RoZSBzdWJzZXQgYWJvdmUgd2FzIGNob3NlbiBiYXNlZCBvbiB0aGUgZW5zZW1ibGUgYW5ub3RhdGlvbi4gY29udmVydCB0byBOQ0JJDQojc2VsZWN0ZWRfZ2VuZXMgPC0gYW5ub3RhdGlvbl9pbmZvJGVudHJlel9JRFttYXRjaChzZWxlY3RlZF9nZW5lcywgYW5ub3RhdGlvbl9pbmZvJGVuc2VtYmxfSUQpXQ0KDQoNCmBgYA0KDQpgYGB7ciwgZWNobz1GQUxTRX0NCiNvbmx5IGtlZXAgaXJpZG9waG9yZSBkZXZlbG9wbWVudCBnZW5lcyB0aGF0IGFyZSByZXNwb25zaXZlIHRvIFQzLCBpLmUuIHRoZXkgZ28gdXAgd2hlbiB5b3UgZ2l2ZSBUMyBhbmQgdGhleSBnbyBkb3duIHdoZW4geW91IGdpdmUgTVBJDQpsb2FkKCJEOi8vQW9jZWxsYXJpc19DUEZfTVBJX1QzL1NhdmVkX29iamVjdHMvVDNJT1BfdXByZWd1bGF0ZWRfZ2VuZXMucmRzIikNCmxvYWQoIkQ6Ly9Bb2NlbGxhcmlzX0NQRl9NUElfVDMvU2F2ZWRfb2JqZWN0cy9NUElfZG93bnJlZ3VsYXRlZF9nZW5lcy5yZHMiKQ0KDQpzZWxlY3RlZF9nZW5lcyA8LSBzZWxlY3RlZF9nZW5lc1tzZWxlY3RlZF9nZW5lcyAlaW4lIE1QSV9kb3ducmVndWxhdGVkXQ0KYGBgDQoNCg0KYGBge3IsIGVjaG89RkFMU0V9DQpsb2FkKCJEOi8vQW9jZWxsYXJpc19DUEZfTVBJX1QzL1NhdmVkX29iamVjdHMvQ1BGX3NpZ25pZmljYW50X2dlbmVzLnJkcyIpDQoNCnNlbGVjdGVkX2dlbmVzIDwtIHNlbGVjdGVkX2dlbmVzW3NlbGVjdGVkX2dlbmVzICVpbiUgQ1BGX3NpZ25pZmljYW50XSAjb25seSBvbmUNCmBgYA0KDQoNCg0KYGBge3IsIGVjaG89RkFMU0V9DQojIFJldHVybnMgdGhlIG1pc3NpbmcgZ2VuZXM6DQptaXNzaW5nX2dlbmVzIDwtIGFzLmRhdGEuZnJhbWUoc2V0ZGlmZihzZWxlY3RlZF9nZW5lcywgcm93Lm5hbWVzKGNvdW50c19WU1QpKSkgDQpjb2xuYW1lcyhtaXNzaW5nX2dlbmVzKSA8LSAiZW50cmV6X0lEIg0KbWlzc2luZ19nZW5lcyRkZXNjcmlwdGlvbiA8LSBhbm5vdGF0aW9uX2luZm8kbWVyZ2VkX2Rlc2NyaXB0aW9uW21hdGNoKG1pc3NpbmdfZ2VuZXMkZW50cmV6X0lELGFubm90YXRpb25faW5mbyRlbnRyZXpfSUQpXQ0KI25vIG1pc3NpbmcgZ2VuZXMNCg0KIyBSZXR1cm5zIHRoZSBleGlzdGluZyBnZW5lczoNCnNlbGVjdGVkX2dlbmVzIDwtIGFzLmRhdGEuZnJhbWUoaW50ZXJzZWN0KHNlbGVjdGVkX2dlbmVzLCByb3cubmFtZXMoY291bnRzX1ZTVCkpKQ0KY29sbmFtZXMoc2VsZWN0ZWRfZ2VuZXMpIDwtICJlbnRyZXpfSUQiDQpzZWxlY3RlZF9nZW5lcyRkZXNjcmlwdGlvbiA8LSBhbm5vdGF0aW9uX2luZm8kbWVyZ2VkX2Rlc2NyaXB0aW9uW21hdGNoKHNlbGVjdGVkX2dlbmVzJGVudHJlel9JRCxhbm5vdGF0aW9uX2luZm8kZW50cmV6X0lEKV0NCg0KI3ByaW50IGxpc3Qgb2YgZGljYXJkZWQgZ2VuZXMgKGJlY2F1c2UgbWlzc2luZykgYW5kIG9mIHJldGFpbmVkIGdlbmVzIChjdXJhdGVkIGRpZ2VzdGlvbiBnZW5lcywgcHJlc2VudCBpbiB0aGUgZGF0YXNldCkNCg0KI2thYmxlKG1pc3NpbmdfZ2VuZXMsIGNhcHRpb24gPSAiR2VuZXMgbWlzc2luZyBmcm9tIHRoZSBkYXRhc2V0IChpZ25vcmVkKSIpDQprYWJsZShzZWxlY3RlZF9nZW5lcywgY2FwdGlvbiA9ICJHZW5lcyBwcmVzZW50IGluIHRoZSBkYXRhc2V0IChyZXRhaW5lZCkiKQ0KDQojIyBzdWJzZXQgdGhlIG9yaWdpbmFsIFZTVCBvYmplY3RzIHRvIG9ubHkga2VlcCBzZWxlY3RlZCBnZW5lcw0KY291bnRzX1ZTVF9zZWxlY3RlZGdlbmVzIDwtIHN1YnNldChjb3VudHNfVlNULCByb3duYW1lcyhjb3VudHNfVlNUKSAlaW4lIHNlbGVjdGVkX2dlbmVzJGVudHJlel9JRCkNCnJvd25hbWVzKGNvdW50c19WU1Rfc2VsZWN0ZWRnZW5lcykgPC0gYW5ub3RhdGlvbl9pbmZvJG1lcmdlZF9kZXNjcmlwdGlvblttYXRjaChyb3duYW1lcyhjb3VudHNfVlNUX3NlbGVjdGVkZ2VuZXMpLCBhbm5vdGF0aW9uX2luZm8kZW50cmV6X0lEKV0NCg0KI3JlbW92ZSB1bnVzZWQgdmFyaWFibGVzDQojcm0oc2VsZWN0ZWRfZ2VuZXMpDQoNCmBgYA0KDQpgYGB7ciwgZmlnLmhlaWdodD0zLCBmaWcud2lkdGg9MTAsIGVjaG89RkFMU0V9DQoNCiMjZGVmaW5lIHRoZSBjb2xvcnMgZm9yIHRoZSBoZWF0bWFwIChjYXRlZ29yaWNhbCk6IDEgY29sb3IgZm9yIGVhY2ggc21hbGxlc3QgZXhwZXJpbWVudGFsIHVuaXQgdGhhdCBpcyBiZWluZyAgY29tcGFyZWQ7IGkuZS4gaGVyZSB0aGUgdHJlYXRtZW50DQpjb2xvcl9jYXRlZ29yaWNhbF9oZWF0bWFwIDwtIGNvbG9yX2NhdGVnb3JpY2FsX3RyZWF0bWVudA0KI25hbWUgdGhpcyBsaXN0IG9mIGNvbG9yIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgbmFtZXMgKG5vdGU6IHRoZXNlIGFyZSB0aGUgdW5pcXVlIHZhbHVlcyBmb3IgdGhhdCBjYXRlZ29yeSBpbiB0aGUgc2FtcGxlIG1ldGFkYXRhKQ0KY29sb3JfY2F0ZWdvcmljYWxfaGVhdG1hcF9uYW1lZCA8LSBjb2xvcl9jYXRlZ29yaWNhbF9oZWF0bWFwDQpuYW1lcyhjb2xvcl9jYXRlZ29yaWNhbF9oZWF0bWFwX25hbWVkKSA8LSB1bmlxdWUoc2FtcGxlX21ldGFkYXRhJHRyZWF0bWVudCkNCg0KI2xvYWQgdGhpcyBpbmZvcm1hdGlvbiBpbnRvIHRoZSBoZWF0bWFwDQpjb2xBbm4gPC0gSGVhdG1hcEFubm90YXRpb24oI2RmID0gZGF0YS5mcmFtZSh0cmVhdG1lbnQgPSBzYW1wbGVfbWV0YWRhdGEkdHJlYXRtZW50KSwgI3RoZSBuYW1lIG9mIHRoZSBjb2x1bW4gbmVlZHMgdG8gbWF0Y2ggdGhlIG5hbWUgb2YgdGhlIG5hbWVkIGxpc3QNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjY29sID0gbGlzdCgidHJlYXRtZW50IiA9IGNvbG9yX2NhdGVnb3JpY2FsX2hlYXRtYXBfbmFtZWQpLCAjc2V0IHRoZSBuYW1lIG9mIHRoZSBuYW1lZCBsaXN0IHNvIGl0IG1hdGNoZXMNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjYW5ub3RhdGlvbl93aWR0aCA9IHVuaXQoYygxLCA0KSwgJ2NtJyksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgI2dhcCA9IHVuaXQoMSwgJ21tJykNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG93X2xlZ2VuZCA9IEZBTFNFLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3dfYW5ub3RhdGlvbl9uYW1lID0gRkFMU0UsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2ggPSAnY29sJywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjYWxzbyBjcmVhdGUgYW4gZW1wdHkgcm93IGFib2UgdGhlIGhlYXRtYXAsIHRvIGRpc3BsYXkgYWRkaXRpb25hbCBpbmZvDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1wdHkxID0gYW5ub19lbXB0eShib3JkZXIgPSBGQUxTRSwgaGVpZ2h0PSB1bml0KDgsICJtbSIpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICkNCg0KDQpIZWF0bWFwKG1hdCA9IHQoc2NhbGUodChjb3VudHNfVlNUX3NlbGVjdGVkZ2VuZXMpKSksDQogICAgICAgIG5hbWU9ICJ6LXNjb3JlIiwNCiAgICAgICAgY29sdW1uX3RpdGxlID0gZ3RfcmVuZGVyKA0KICAgICAgICAgICJQYXR0ZXJuIG9mIGV4cHJlc3Npb24gKGFzIDxzcGFuIHN0eWxlPSdjb2xvcjpicm93bjInPioqei1zY29yZXMqKjwvc3Bhbj4pIDxici8+IG9mIGlyaWRvcGhvcmUgZ2VuZXMiDQogICAgICAgICAgKSwNCiAgICAgICAgY29sID0gcmV2KGJyZXdlci5wYWwoMTEsIlJkQnUiKSksDQogICAgICAgIG5hX2NvbCA9ICJibGFjayIsDQogICAgICAgIGNsdXN0ZXJfcm93cyA9IFQsDQogICAgICAgIHNob3dfcm93X2RlbmQgPSBULA0KICAgICAgICAjcm93X29yZGVyID0gb3JkZXJlZF9sZXZlbHMsDQogICAgICAgIGNsdXN0ZXJfY29sdW1ucyA9IEZBTFNFLA0KICAgICAgICBzaG93X2NvbHVtbl9kZW5kID0gRkFMU0UsDQogICAgICAgICNjb2x1bW5fb3JkZXIgPSBvcmRlcmVkX2xldmVscywNCiAgICAgICAgI3Jvd19zcGxpdCA9IGZhY3RvcihwYXN0ZTAoc2FtcGxlX21ldGFkYXRhJHNlZ21lbnQsIHNhbXBsZV9tZXRhZGF0YSRzdGFnZSksIGxldmVscyA9IGMoImxpdmVyUzEiLCAibGl2ZXJTNCIsICJsaXZlclM3IiwgInN0b21hY2hTMSIsICJpbnRlc3RpbmVTMSIsICJzdG9tYWNoUzQiLCAiQV9pbnRlc3RpbmVTNCIsICJQX2ludGVzdGluZVM0IiwgInN0b21hY2hTNyIsICJBX2ludGVzdGluZVM3IiwgIlBfaW50ZXN0aW5lUzciKSksDQogICAgICAgIGNvbHVtbl9zcGxpdCA9IGZhY3RvcihzYW1wbGVfbWV0YWRhdGEkdHJlYXRtZW50LCBsZXZlbHMgPSBjKCJETVNPIiwgIlQzSU9QIiwgIk1QSSIsICJDUEYiLCAiQ1BGLlQzSU9QIikpLA0KICAgICAgICAjY2x1c3Rlcl9yb3dfc2xpY2VzID0gRkFMU0UsDQogICAgICAgIGNsdXN0ZXJfY29sdW1uX3NsaWNlcyA9IEZBTFNFLA0KICAgICAgICByb3dfdGl0bGUgPSBOVUxMLA0KICAgICAgICByb3dfZ2FwID0gdW5pdCgwLjUsICJtbSIpLA0KICAgICAgICBjb2x1bW5fZ2FwID0gdW5pdChjKHJlcCgxMCwxKSwgcmVwKDIsMykpLCAibW0iKSwNCiAgICAgICAgI3dpZHRoID0gdW5pdCg4LCAiY20iKSwgDQogICAgICAgICNoZWlnaHQgPSB1bml0KDgsICJjbSIpLA0KICAgICAgICBjb2x1bW5fbmFtZXNfZ3AgPSBncmlkOjpncGFyKGZvbnRzaXplID0gOCksDQogICAgICAgIHJvd19uYW1lc19ncCA9IGdyaWQ6OmdwYXIoZm9udHNpemUgPSA4KSwNCiAgICAgICAgdG9wX2Fubm90YXRpb24gPSBjb2xBbm4sDQogICAgICAgICNsZWZ0X2Fubm90YXRpb24gPSByb3dBbm4sDQogICAgICAgIHNob3dfaGVhdG1hcF9sZWdlbmQgPSBGLA0KICAgICAgICBib3JkZXIgPSBUUlVFLA0KICAgICAgICBjbHVzdGVyaW5nX21ldGhvZF9yb3dzID0gJ3dhcmQuRDInDQogICAgICAgICkNCg0KDQpsaWJyYXJ5KEdldG9wdExvbmcpICAjIGZvciB0aGUgZnVuY3Rpb24gcXEoKQ0KZ3JvdXBfYmxvY2tfYW5ubyA9IGZ1bmN0aW9uKGdyb3VwLCBlbXB0eV9hbm5vLCBncCA9IGdwYXIoKSwgDQogICAgbGFiZWwgPSBOVUxMLCBsYWJlbF9ncCA9IGdwYXIoKSkgew0KDQogICAgc2Vla1ZpZXdwb3J0KHFxKCJhbm5vdGF0aW9uX0B7ZW1wdHlfYW5ub31fQHttaW4oZ3JvdXApfSIpKQ0KICAgIGxvYzEgPSBkZXZpY2VMb2MoeCA9IHVuaXQoMCwgIm5wYyIpLCB5ID0gdW5pdCgwLCAibnBjIikpDQogICAgc2Vla1ZpZXdwb3J0KHFxKCJhbm5vdGF0aW9uX0B7ZW1wdHlfYW5ub31fQHttYXgoZ3JvdXApfSIpKQ0KICAgIGxvYzIgPSBkZXZpY2VMb2MoeCA9IHVuaXQoMSwgIm5wYyIpLCB5ID0gdW5pdCgxLCAibnBjIikpDQoNCiAgICBzZWVrVmlld3BvcnQoImdsb2JhbCIpDQogICAgZ3JpZC5yZWN0KGxvYzEkeCwgbG9jMSR5LCB3aWR0aCA9IGxvYzIkeCAtIGxvYzEkeCwgaGVpZ2h0ID0gbG9jMiR5IC0gbG9jMSR5LCANCiAgICAgICAganVzdCA9IGMoImxlZnQiLCAiYm90dG9tIiksIGdwID0gZ3ApDQogICAgaWYoIWlzLm51bGwobGFiZWwpKSB7DQogICAgICAgIGdyaWQudGV4dChsYWJlbCwgeCA9IChsb2MxJHggKyBsb2MyJHgpKjAuNSwgeSA9IChsb2MxJHkgKyBsb2MyJHkpKjAuNSwgZ3AgPSBsYWJlbF9ncCkNCiAgICB9DQp9DQoNCmdyb3VwX2Jsb2NrX2Fubm8oMToxLCAiZW1wdHkxIiwgZ3AgPSBncGFyKGZpbGwgPSAiZ3JheTcwIiksIGxhYmVsID0gIkRNU08iKQ0KZ3JvdXBfYmxvY2tfYW5ubygyOjIsICJlbXB0eTEiLCBncCA9IGdwYXIoZmlsbCA9ICJwYWxlZ3JlZW4zIiksIGxhYmVsID0gIlQzK0lPUCIpDQpncm91cF9ibG9ja19hbm5vKDM6MywgImVtcHR5MSIsIGdwID0gZ3BhcihmaWxsID0gImxpZ2h0Y29yYWwiKSwgbGFiZWwgPSAiTVBJIikNCmdyb3VwX2Jsb2NrX2Fubm8oNDo0LCAiZW1wdHkxIiwgZ3AgPSBncGFyKGZpbGwgPSAibGlnaHRza3libHVlIiksIGxhYmVsID0gIkNQRiIpDQpncm91cF9ibG9ja19hbm5vKDU6NSwgImVtcHR5MSIsIGdwID0gZ3BhcihmaWxsID0gIm9yY2hpZDIiKSwgbGFiZWwgPSAiQ1BGK1QzK0lPUCIpDQoNCg0KYGBgDQoNCiMjIyMjIE9zc2lmaWNhdGlvbg0KDQpgYGB7ciwgZWNobz1GQUxTRX0NCiNsb2FkIHRoZSBjb3VudHNfVlNUIG9iamVjdA0KbG9hZCgiRDovL0FvY2VsbGFyaXNfQ1BGX01QSV9UMy9TYXZlZF9vYmplY3RzL2NvdW50c19WU1QucmRzIikNCmBgYA0KDQpgYGB7ciwgZWNobz1GQUxTRX0NCiNzZWxlY3QgZ2VuZXMNCg0KZ2VuZWxpc3QgPC0gYygiMTExNTg2MjAyIiwgDQogICAgICAgICAgICAgICIxMTE1NjU4NzciLCANCiAgICAgICAgICAgICAgIjExMTU3NTQ1MiIsIA0KICAgICAgICAgICAgICAiMTExNTc4ODkxIiwgDQogICAgICAgICAgICAgICIxMTE1ODUwMzgiLCANCiAgICAgICAgICAgICAgIjExMTU2ODgwNCIsICNtYXR1cmUgb3N0ZW9ibGFzdHMNCiAgICAgICAgICAgICAgIjExMTU4NjA5MiIsDQogICAgICAgICAgICAgICIxMjkzNDg1NjEiLCANCiAgICAgICAgICAgICAgIjExMTU4ODU5MCIsICNkZXZlbG9waW5nIGJvbnkgZWxlbWVudHMgYW5kIGVjdG9kZXJtDQogICAgICAgICAgICAgICIxMTE1NzkxODYiLA0KICAgICAgICAgICAgICAiMTExNTczMzQ3IiwNCiAgICAgICAgICAgICAgIjExMTU2ODc5OSIsDQogICAgICAgICAgICAgICIxMTE1ODMwNTAiLA0KICAgICAgICAgICAgICAiMTExNTY2MDM4IiwNCiAgICAgICAgICAgICAgIjExMTU2MzY3NSIsDQogICAgICAgICAgICAgICIxMTE1ODE3MzYiLA0KICAgICAgICAgICAgICAiMTExNTY2NzgzIiwgI3VjbWFiDQogICAgICAgICAgICAgICIxMTE1NzgxMzgiLCAjZGVjb3Jpbg0KICAgICAgICAgICAgICAiMTExNTg1Mzk0IiwgI29zdGVvYmxhc3QgZGlmZmVyZW50aWF0aW9uIGFuZCBmdW5jdGlvbg0KICAgICAgICAgICAgICAiMTExNTcxNjMxIiwgI29zdGVvY2xhc3RzDQogICAgICAgICAgICAgICIxMTE1ODM3ODIiLCAjc3A3IGludGVybWVkaWF0ZSBvc3Rlb2JsYXN0cw0KICAgICAgICAgICAgICAiMTI5MzUwODQ5IiwgI3J1bngyYQ0KICAgICAgICAgICAgICAiMTExNTczNTEzIiwgI3J1bngyYg0KICAgICAgICAgICAgICAiMTExNTY2OTg0IiwgI3AzOA0KICAgICAgICAgICAgICAiMTExNTg3ODc1IiwgI3AzOA0KICAgICAgICAgICAgICAiMTExNTgwNDM2IiwgI2NhbGNpbmV1cmluIGV4cHJlc3NlZCBpbiBvc3Rlb2JsYXN0cyBhbmQgZW5oYW5jZXMgdGhlIGRpZmZlcmVudGlhdGlvbiBvZiBvc3Rlb2JsYXN0cw0KICAgICAgICAgICAgICAiMTExNTg3MDAwIiwNCiAgICAgICAgICAgICAgIjExMTU4Njk1OSIsDQogICAgICAgICAgICAgICIxMTE1Njg2MTEiLCAjZmdmcjQNCiAgICAgICAgICAgICAgIjExMTU2NDg0MCIsICNmaWJyb25lY3RpbjFiDQogICAgICAgICAgICAgICIxMTE1ODE4MTEiLA0KICAgICAgICAgICAgICAiMTExNTgzODk1IiwgI29zdGVvY2FsY2luMg0KICAgICAgICAgICAgICAiMTExNTczMjY4IiwjY29sMTBhMWENCiAgICAgICAgICAgICAgIjExMTU4MTMyMSIsICNzcHAxDQogICAgICAgICAgICAgICIxMTE1ODA3OTMiLCAjc3BwMg0KICAgICAgICAgICAgICAiMTExNTY4OTM5IiwgI3RycHY2DQogICAgICAgICAgICAgICIxMTE1ODMxNjMiLA0KICAgICAgICAgICAgICAiMTExNTg1ODU4IiwNCiAgICAgICAgICAgICAgIjExMTU2NDk3OCIsDQogICAgICAgICAgICAgICIxMTE1NjY3ODMiDQogICAgICAgICAgICAgICkNCg0KDQoNCiNhbm5vdGF0aW9uX2luZm9bYW5ub3RhdGlvbl9pbmZvJGVuc2VtYmxfSUQgJWluJSBnZW5lbGlzdCxjKCJlbnNlbWJsX0lEIiwgImVudHJlel9JRCIpXQ0KDQoNCg0Kc2VsZWN0ZWRfZ2VuZXMgPC0gYyhnZW5lbGlzdCkNCg0KDQoNCiN0aGUgc3Vic2V0IGFib3ZlIHdhcyBjaG9zZW4gYmFzZWQgb24gdGhlIGVuc2VtYmxlIGFubm90YXRpb24uIGNvbnZlcnQgdG8gTkNCSQ0KI3NlbGVjdGVkX2dlbmVzIDwtIGFubm90YXRpb25faW5mbyRlbnRyZXpfSURbbWF0Y2goc2VsZWN0ZWRfZ2VuZXMsIGFubm90YXRpb25faW5mbyRlbnNlbWJsX0lEKV0NCg0KDQpgYGANCg0KYGBge3IsIGVjaG89RkFMU0V9DQojb25seSBrZWVwIENQRiBERSBnZW5lcw0KbG9hZCgiRDovL0FvY2VsbGFyaXNfQ1BGX01QSV9UMy9TYXZlZF9vYmplY3RzL0NQRl9kb3ducmVndWxhdGVkX2dlbmVzLnJkcyIpDQpsb2FkKCJEOi8vQW9jZWxsYXJpc19DUEZfTVBJX1QzL1NhdmVkX29iamVjdHMvQ1BGX3VwcmVndWxhdGVkX2dlbmVzLnJkcyIpDQoNCnNlbGVjdGVkX2dlbmVzIDwtIHNlbGVjdGVkX2dlbmVzW3NlbGVjdGVkX2dlbmVzICVpbiUgdW5pb24oQ1BGX3VwcmVndWxhdGVkLCBDUEZfZG93bnJlZ3VsYXRlZCldICNvbmx5IG9uZQ0KYGBgDQoNCg0KYGBge3IsIGVjaG89RkFMU0V9DQojIFJldHVybnMgdGhlIG1pc3NpbmcgZ2VuZXM6DQptaXNzaW5nX2dlbmVzIDwtIGFzLmRhdGEuZnJhbWUoc2V0ZGlmZihzZWxlY3RlZF9nZW5lcywgcm93Lm5hbWVzKGNvdW50c19WU1QpKSkgDQpjb2xuYW1lcyhtaXNzaW5nX2dlbmVzKSA8LSAiZW50cmV6X0lEIg0KbWlzc2luZ19nZW5lcyRkZXNjcmlwdGlvbiA8LSBhbm5vdGF0aW9uX2luZm8kbWVyZ2VkX2Rlc2NyaXB0aW9uW21hdGNoKG1pc3NpbmdfZ2VuZXMkZW50cmV6X0lELGFubm90YXRpb25faW5mbyRlbnRyZXpfSUQpXQ0KI25vIG1pc3NpbmcgZ2VuZXMNCg0KIyBSZXR1cm5zIHRoZSBleGlzdGluZyBnZW5lczoNCnNlbGVjdGVkX2dlbmVzIDwtIGFzLmRhdGEuZnJhbWUoaW50ZXJzZWN0KHNlbGVjdGVkX2dlbmVzLCByb3cubmFtZXMoY291bnRzX1ZTVCkpKQ0KY29sbmFtZXMoc2VsZWN0ZWRfZ2VuZXMpIDwtICJlbnRyZXpfSUQiDQpzZWxlY3RlZF9nZW5lcyRkZXNjcmlwdGlvbiA8LSBhbm5vdGF0aW9uX2luZm8kbWVyZ2VkX2Rlc2NyaXB0aW9uW21hdGNoKHNlbGVjdGVkX2dlbmVzJGVudHJlel9JRCxhbm5vdGF0aW9uX2luZm8kZW50cmV6X0lEKV0NCg0KI3ByaW50IGxpc3Qgb2YgZGljYXJkZWQgZ2VuZXMgKGJlY2F1c2UgbWlzc2luZykgYW5kIG9mIHJldGFpbmVkIGdlbmVzIChjdXJhdGVkIGRpZ2VzdGlvbiBnZW5lcywgcHJlc2VudCBpbiB0aGUgZGF0YXNldCkNCg0KI2thYmxlKG1pc3NpbmdfZ2VuZXMsIGNhcHRpb24gPSAiR2VuZXMgbWlzc2luZyBmcm9tIHRoZSBkYXRhc2V0IChpZ25vcmVkKSIpDQprYWJsZShzZWxlY3RlZF9nZW5lcywgY2FwdGlvbiA9ICJHZW5lcyBwcmVzZW50IGluIHRoZSBkYXRhc2V0IChyZXRhaW5lZCkiKQ0KDQojIyBzdWJzZXQgdGhlIG9yaWdpbmFsIFZTVCBvYmplY3RzIHRvIG9ubHkga2VlcCBzZWxlY3RlZCBnZW5lcw0KY291bnRzX1ZTVF9zZWxlY3RlZGdlbmVzIDwtIHN1YnNldChjb3VudHNfVlNULCByb3duYW1lcyhjb3VudHNfVlNUKSAlaW4lIHNlbGVjdGVkX2dlbmVzJGVudHJlel9JRCkNCnJvd25hbWVzKGNvdW50c19WU1Rfc2VsZWN0ZWRnZW5lcykgPC0gYW5ub3RhdGlvbl9pbmZvJG1lcmdlZF9kZXNjcmlwdGlvblttYXRjaChyb3duYW1lcyhjb3VudHNfVlNUX3NlbGVjdGVkZ2VuZXMpLCBhbm5vdGF0aW9uX2luZm8kZW50cmV6X0lEKV0NCg0KI3JlbW92ZSB1bnVzZWQgdmFyaWFibGVzDQpybShzZWxlY3RlZF9nZW5lcykNCg0KYGBgDQoNCmBgYHtyLCBmaWcuaGVpZ2h0PTMsIGZpZy53aWR0aD0xMCwgZWNobz1GQUxTRX0NCg0KIyNkZWZpbmUgdGhlIGNvbG9ycyBmb3IgdGhlIGhlYXRtYXAgKGNhdGVnb3JpY2FsKTogMSBjb2xvciBmb3IgZWFjaCBzbWFsbGVzdCBleHBlcmltZW50YWwgdW5pdCB0aGF0IGlzIGJlaW5nICBjb21wYXJlZDsgaS5lLiBoZXJlIHRoZSB0cmVhdG1lbnQNCmNvbG9yX2NhdGVnb3JpY2FsX2hlYXRtYXAgPC0gY29sb3JfY2F0ZWdvcmljYWxfdHJlYXRtZW50DQojbmFtZSB0aGlzIGxpc3Qgb2YgY29sb3Igd2l0aCB0aGUgY29ycmVzcG9uZGluZyBuYW1lcyAobm90ZTogdGhlc2UgYXJlIHRoZSB1bmlxdWUgdmFsdWVzIGZvciB0aGF0IGNhdGVnb3J5IGluIHRoZSBzYW1wbGUgbWV0YWRhdGEpDQpjb2xvcl9jYXRlZ29yaWNhbF9oZWF0bWFwX25hbWVkIDwtIGNvbG9yX2NhdGVnb3JpY2FsX2hlYXRtYXANCm5hbWVzKGNvbG9yX2NhdGVnb3JpY2FsX2hlYXRtYXBfbmFtZWQpIDwtIHVuaXF1ZShzYW1wbGVfbWV0YWRhdGEkdHJlYXRtZW50KQ0KDQojbG9hZCB0aGlzIGluZm9ybWF0aW9uIGludG8gdGhlIGhlYXRtYXANCmNvbEFubiA8LSBIZWF0bWFwQW5ub3RhdGlvbigjZGYgPSBkYXRhLmZyYW1lKHRyZWF0bWVudCA9IHNhbXBsZV9tZXRhZGF0YSR0cmVhdG1lbnQpLCAjdGhlIG5hbWUgb2YgdGhlIGNvbHVtbiBuZWVkcyB0byBtYXRjaCB0aGUgbmFtZSBvZiB0aGUgbmFtZWQgbGlzdA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICNjb2wgPSBsaXN0KCJ0cmVhdG1lbnQiID0gY29sb3JfY2F0ZWdvcmljYWxfaGVhdG1hcF9uYW1lZCksICNzZXQgdGhlIG5hbWUgb2YgdGhlIG5hbWVkIGxpc3Qgc28gaXQgbWF0Y2hlcw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICNhbm5vdGF0aW9uX3dpZHRoID0gdW5pdChjKDEsIDQpLCAnY20nKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjZ2FwID0gdW5pdCgxLCAnbW0nKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3dfbGVnZW5kID0gRkFMU0UsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd19hbm5vdGF0aW9uX25hbWUgPSBGQUxTRSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGljaCA9ICdjb2wnLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICNhbHNvIGNyZWF0ZSBhbiBlbXB0eSByb3cgYWJvZSB0aGUgaGVhdG1hcCwgdG8gZGlzcGxheSBhZGRpdGlvbmFsIGluZm8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbXB0eTEgPSBhbm5vX2VtcHR5KGJvcmRlciA9IEZBTFNFLCBoZWlnaHQ9IHVuaXQoOCwgIm1tIikpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKQ0KDQoNCkhlYXRtYXAobWF0ID0gdChzY2FsZSh0KGNvdW50c19WU1Rfc2VsZWN0ZWRnZW5lcykpKSwNCiAgICAgICAgbmFtZT0gInotc2NvcmUiLA0KICAgICAgICBjb2x1bW5fdGl0bGUgPSBndF9yZW5kZXIoDQogICAgICAgICAgIlBhdHRlcm4gb2YgZXhwcmVzc2lvbiAoYXMgPHNwYW4gc3R5bGU9J2NvbG9yOmJyb3duMic+Kip6LXNjb3JlcyoqPC9zcGFuPikgPGJyLz4gb2Ygb3NzaWZpY2F0aW9uIGdlbmVzIg0KICAgICAgICAgICksDQogICAgICAgIGNvbCA9IHJldihicmV3ZXIucGFsKDExLCJSZEJ1IikpLA0KICAgICAgICBuYV9jb2wgPSAiYmxhY2siLA0KICAgICAgICBjbHVzdGVyX3Jvd3MgPSBULA0KICAgICAgICBzaG93X3Jvd19kZW5kID0gVCwNCiAgICAgICAgI3Jvd19vcmRlciA9IG9yZGVyZWRfbGV2ZWxzLA0KICAgICAgICBjbHVzdGVyX2NvbHVtbnMgPSBGQUxTRSwNCiAgICAgICAgc2hvd19jb2x1bW5fZGVuZCA9IEZBTFNFLA0KICAgICAgICAjY29sdW1uX29yZGVyID0gb3JkZXJlZF9sZXZlbHMsDQogICAgICAgICNyb3dfc3BsaXQgPSBmYWN0b3IocGFzdGUwKHNhbXBsZV9tZXRhZGF0YSRzZWdtZW50LCBzYW1wbGVfbWV0YWRhdGEkc3RhZ2UpLCBsZXZlbHMgPSBjKCJsaXZlclMxIiwgImxpdmVyUzQiLCAibGl2ZXJTNyIsICJzdG9tYWNoUzEiLCAiaW50ZXN0aW5lUzEiLCAic3RvbWFjaFM0IiwgIkFfaW50ZXN0aW5lUzQiLCAiUF9pbnRlc3RpbmVTNCIsICJzdG9tYWNoUzciLCAiQV9pbnRlc3RpbmVTNyIsICJQX2ludGVzdGluZVM3IikpLA0KICAgICAgICBjb2x1bW5fc3BsaXQgPSBmYWN0b3Ioc2FtcGxlX21ldGFkYXRhJHRyZWF0bWVudCwgbGV2ZWxzID0gYygiRE1TTyIsICJUM0lPUCIsICJNUEkiLCAiQ1BGIiwgIkNQRi5UM0lPUCIpKSwNCiAgICAgICAgI2NsdXN0ZXJfcm93X3NsaWNlcyA9IEZBTFNFLA0KICAgICAgICBjbHVzdGVyX2NvbHVtbl9zbGljZXMgPSBGQUxTRSwNCiAgICAgICAgcm93X3RpdGxlID0gTlVMTCwNCiAgICAgICAgcm93X2dhcCA9IHVuaXQoMC41LCAibW0iKSwNCiAgICAgICAgY29sdW1uX2dhcCA9IHVuaXQoYyhyZXAoMTAsMSksIHJlcCgyLDMpKSwgIm1tIiksDQogICAgICAgICN3aWR0aCA9IHVuaXQoOCwgImNtIiksIA0KICAgICAgICAjaGVpZ2h0ID0gdW5pdCg4LCAiY20iKSwNCiAgICAgICAgY29sdW1uX25hbWVzX2dwID0gZ3JpZDo6Z3Bhcihmb250c2l6ZSA9IDgpLA0KICAgICAgICByb3dfbmFtZXNfZ3AgPSBncmlkOjpncGFyKGZvbnRzaXplID0gOCksDQogICAgICAgIHRvcF9hbm5vdGF0aW9uID0gY29sQW5uLA0KICAgICAgICAjbGVmdF9hbm5vdGF0aW9uID0gcm93QW5uLA0KICAgICAgICBzaG93X2hlYXRtYXBfbGVnZW5kID0gVFJVRSwNCiAgICAgICAgYm9yZGVyID0gVFJVRSwNCiAgICAgICAgY2x1c3RlcmluZ19tZXRob2Rfcm93cyA9ICd3YXJkLkQyJw0KICAgICAgICApDQoNCg0KbGlicmFyeShHZXRvcHRMb25nKSAgIyBmb3IgdGhlIGZ1bmN0aW9uIHFxKCkNCmdyb3VwX2Jsb2NrX2Fubm8gPSBmdW5jdGlvbihncm91cCwgZW1wdHlfYW5ubywgZ3AgPSBncGFyKCksIA0KICAgIGxhYmVsID0gTlVMTCwgbGFiZWxfZ3AgPSBncGFyKCkpIHsNCg0KICAgIHNlZWtWaWV3cG9ydChxcSgiYW5ub3RhdGlvbl9Ae2VtcHR5X2Fubm99X0B7bWluKGdyb3VwKX0iKSkNCiAgICBsb2MxID0gZGV2aWNlTG9jKHggPSB1bml0KDAsICJucGMiKSwgeSA9IHVuaXQoMCwgIm5wYyIpKQ0KICAgIHNlZWtWaWV3cG9ydChxcSgiYW5ub3RhdGlvbl9Ae2VtcHR5X2Fubm99X0B7bWF4KGdyb3VwKX0iKSkNCiAgICBsb2MyID0gZGV2aWNlTG9jKHggPSB1bml0KDEsICJucGMiKSwgeSA9IHVuaXQoMSwgIm5wYyIpKQ0KDQogICAgc2Vla1ZpZXdwb3J0KCJnbG9iYWwiKQ0KICAgIGdyaWQucmVjdChsb2MxJHgsIGxvYzEkeSwgd2lkdGggPSBsb2MyJHggLSBsb2MxJHgsIGhlaWdodCA9IGxvYzIkeSAtIGxvYzEkeSwgDQogICAgICAgIGp1c3QgPSBjKCJsZWZ0IiwgImJvdHRvbSIpLCBncCA9IGdwKQ0KICAgIGlmKCFpcy5udWxsKGxhYmVsKSkgew0KICAgICAgICBncmlkLnRleHQobGFiZWwsIHggPSAobG9jMSR4ICsgbG9jMiR4KSowLjUsIHkgPSAobG9jMSR5ICsgbG9jMiR5KSowLjUsIGdwID0gbGFiZWxfZ3ApDQogICAgfQ0KfQ0KDQpncm91cF9ibG9ja19hbm5vKDE6MSwgImVtcHR5MSIsIGdwID0gZ3BhcihmaWxsID0gImdyYXk3MCIpLCBsYWJlbCA9ICJETVNPIikNCmdyb3VwX2Jsb2NrX2Fubm8oMjoyLCAiZW1wdHkxIiwgZ3AgPSBncGFyKGZpbGwgPSAicGFsZWdyZWVuMyIpLCBsYWJlbCA9ICJUMytJT1AiKQ0KZ3JvdXBfYmxvY2tfYW5ubygzOjMsICJlbXB0eTEiLCBncCA9IGdwYXIoZmlsbCA9ICJsaWdodGNvcmFsIiksIGxhYmVsID0gIk1QSSIpDQpncm91cF9ibG9ja19hbm5vKDQ6NCwgImVtcHR5MSIsIGdwID0gZ3BhcihmaWxsID0gImxpZ2h0c2t5Ymx1ZSIpLCBsYWJlbCA9ICJDUEYiKQ0KZ3JvdXBfYmxvY2tfYW5ubyg1OjUsICJlbXB0eTEiLCBncCA9IGdwYXIoZmlsbCA9ICJvcmNoaWQyIiksIGxhYmVsID0gIkNQRitUMytJT1AiKQ0KDQoNCmBgYA0KDQojIyMjIyBWaXNpb24vb3BzaW5zDQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KI2xvYWQgdGhlIGNvdW50c19WU1Qgb2JqZWN0DQpsb2FkKCJEOi8vQW9jZWxsYXJpc19DUEZfTVBJX1QzL1NhdmVkX29iamVjdHMvY291bnRzX1ZTVC5yZHMiKQ0KbG9hZCgiRDovL0FvY2VsbGFyaXNfQ1BGX01QSV9UMy9TYXZlZF9vYmplY3RzL3NhbXBsZV9tZXRhZGF0YS5yZHMiKQ0KYGBgDQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KI3NlbGVjdCBnZW5lcw0KDQpnZW5lbGlzdCA8LSBjKCIxMTE1NzAzODUiLCIxMTE1NzM5ODgiLCIxMTE1ODYwODQiLCIxMTE1Njc3NzgiLCIxMTE1NzM5NjMiLCIxMTE1NzY4MjgiLCIxMTE1NzUyOTMiLCIxMTE1NzUyOTEiLCIxMTE1NzUyNTAiLCANCiAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICIxMTE1Nzk2NDYiLCIxMTE1ODYyMzIiLCIxMTE1Njc3NzIiLCIxMTE1NjM0MjMiLCIxMTE1ODEwOTMiLCIxMTE1Nzg4ODYiLCIxMTE1NjMwMTYiLCIxMTE1ODcwNzAiLCIxMTE1ODcwNjkiLCIxMTE1ODg1MzQiLCIxMTE1ODQ3NjUiLCIxMTE1ODE1MjUiLCIxMTE1NjQ3MzIiLCIxMTE1Nzk5MDEiLCIxMTE1NzEwNzYiLCIxMTE1NjkyMzkiLCIxMTE1NzMzNzEiLCIxMTE1NzkyNTUiLCIxMTE1ODI5NzAiLCIxMTE1ODI0NDIiLCIxMTE1ODg1MTMiLCIxMTE1ODU1MDciLCIxMTE1ODQwNDEiLCIxMTE1NzIwODYiLCIxMTE1NjM2MjkiLCIxMTE1NzU1MjQiLCIxMTE1ODg1MTQiLCIxMTE1NjkxODUiLCIxMTE1ODAwODYiLCIxMTE1NjcwNzciLCIxMTE1NzMwNDciLCIxMTE1NjQzNzIiLCIxMTE1NjQ2NTYiLCIxMTE1NzgxMzMiLCIxMTE1ODE4MDkiLCIxMTE1ODE4MTAiLCIxMTE1NzQ1MDEiLCIxMTE1NzQ4NjIiLCIxMTE1NjMxMzEiLCIxMTE1NjU4MzUiLCIxMTE1ODY3MzEiLCIxMTE1Njc0NDAiLCIxMTE1NzUxMDciLCIxMTE1NzU2OTgiLCIxMTE1NzU3MDMiLCIxMTE1NzM1ODgiLCIxMTE1NzUwMTQiDQogICAgICAgICAgICAgICkNCg0KDQojZ2VuZWxpc3QgPC0gYygiMTExNTcwMzg1IiwiMTExNTczOTg4IiwiMTExNTg2MDg0IiwiMTExNTY3Nzc4IiwiMTExNTczOTYzIiwiMTExNTc2ODI4IiwiMTExNTc1MjkzIiwiMTExNTc1MjkxIiwiMTExNTc1MjUwIikNCg0KDQojYW5ub3RhdGlvbl9pbmZvW2Fubm90YXRpb25faW5mbyRlbnNlbWJsX0lEICVpbiUgZ2VuZWxpc3QsYygiZW5zZW1ibF9JRCIsICJlbnRyZXpfSUQiKV0NCg0KDQoNCnNlbGVjdGVkX2dlbmVzIDwtIGMoZ2VuZWxpc3QpDQoNCg0KDQojdGhlIHN1YnNldCBhYm92ZSB3YXMgY2hvc2VuIGJhc2VkIG9uIHRoZSBlbnNlbWJsZSBhbm5vdGF0aW9uLiBjb252ZXJ0IHRvIE5DQkkNCiNzZWxlY3RlZF9nZW5lcyA8LSBhbm5vdGF0aW9uX2luZm8kZW50cmV6X0lEW21hdGNoKHNlbGVjdGVkX2dlbmVzLCBhbm5vdGF0aW9uX2luZm8kZW5zZW1ibF9JRCldDQoNCg0KYGBgDQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KbG9hZCgiRDovL0FvY2VsbGFyaXNfQ1BGX01QSV9UMy9TYXZlZF9vYmplY3RzL0NQRl9kb3ducmVndWxhdGVkX2dlbmVzLnJkcyIpDQpsb2FkKCJEOi8vQW9jZWxsYXJpc19DUEZfTVBJX1QzL1NhdmVkX29iamVjdHMvQ1BGX3VwcmVndWxhdGVkX2dlbmVzLnJkcyIpDQoNCnNlbGVjdGVkX2dlbmVzIDwtIHNlbGVjdGVkX2dlbmVzW3NlbGVjdGVkX2dlbmVzICVpbiUgdW5pb24oQ1BGX2Rvd25yZWd1bGF0ZWQsIENQRl91cHJlZ3VsYXRlZCldICNvbmx5IG9uZQ0KYGBgDQoNCg0KYGBge3IsIGVjaG89RkFMU0V9DQojIFJldHVybnMgdGhlIG1pc3NpbmcgZ2VuZXM6DQptaXNzaW5nX2dlbmVzIDwtIGFzLmRhdGEuZnJhbWUoc2V0ZGlmZihzZWxlY3RlZF9nZW5lcywgcm93Lm5hbWVzKGNvdW50c19WU1QpKSkgDQpjb2xuYW1lcyhtaXNzaW5nX2dlbmVzKSA8LSAiZW50cmV6X0lEIg0KbWlzc2luZ19nZW5lcyRkZXNjcmlwdGlvbiA8LSBhbm5vdGF0aW9uX2luZm8kbWVyZ2VkX2Rlc2NyaXB0aW9uW21hdGNoKG1pc3NpbmdfZ2VuZXMkZW50cmV6X0lELGFubm90YXRpb25faW5mbyRlbnRyZXpfSUQpXQ0KI25vIG1pc3NpbmcgZ2VuZXMNCg0KIyBSZXR1cm5zIHRoZSBleGlzdGluZyBnZW5lczoNCnNlbGVjdGVkX2dlbmVzIDwtIGFzLmRhdGEuZnJhbWUoaW50ZXJzZWN0KHNlbGVjdGVkX2dlbmVzLCByb3cubmFtZXMoY291bnRzX1ZTVCkpKQ0KY29sbmFtZXMoc2VsZWN0ZWRfZ2VuZXMpIDwtICJlbnRyZXpfSUQiDQpzZWxlY3RlZF9nZW5lcyRkZXNjcmlwdGlvbiA8LSBhbm5vdGF0aW9uX2luZm8kbWVyZ2VkX2Rlc2NyaXB0aW9uW21hdGNoKHNlbGVjdGVkX2dlbmVzJGVudHJlel9JRCxhbm5vdGF0aW9uX2luZm8kZW50cmV6X0lEKV0NCg0KI3ByaW50IGxpc3Qgb2YgZGljYXJkZWQgZ2VuZXMgKGJlY2F1c2UgbWlzc2luZykgYW5kIG9mIHJldGFpbmVkIGdlbmVzIChjdXJhdGVkIGRpZ2VzdGlvbiBnZW5lcywgcHJlc2VudCBpbiB0aGUgZGF0YXNldCkNCg0KI2thYmxlKG1pc3NpbmdfZ2VuZXMsIGNhcHRpb24gPSAiR2VuZXMgbWlzc2luZyBmcm9tIHRoZSBkYXRhc2V0IChpZ25vcmVkKSIpDQprYWJsZShzZWxlY3RlZF9nZW5lcywgY2FwdGlvbiA9ICJHZW5lcyBwcmVzZW50IGluIHRoZSBkYXRhc2V0IChyZXRhaW5lZCkiKQ0KDQojIyBzdWJzZXQgdGhlIG9yaWdpbmFsIFZTVCBvYmplY3RzIHRvIG9ubHkga2VlcCBzZWxlY3RlZCBnZW5lcw0KY291bnRzX1ZTVF9zZWxlY3RlZGdlbmVzIDwtIHN1YnNldChjb3VudHNfVlNULCByb3duYW1lcyhjb3VudHNfVlNUKSAlaW4lIHNlbGVjdGVkX2dlbmVzJGVudHJlel9JRCkNCnJvd25hbWVzKGNvdW50c19WU1Rfc2VsZWN0ZWRnZW5lcykgPC0gYW5ub3RhdGlvbl9pbmZvJG1lcmdlZF9kZXNjcmlwdGlvblttYXRjaChyb3duYW1lcyhjb3VudHNfVlNUX3NlbGVjdGVkZ2VuZXMpLCBhbm5vdGF0aW9uX2luZm8kZW50cmV6X0lEKV0NCg0KI3JlbW92ZSB1bnVzZWQgdmFyaWFibGVzDQojcm0oc2VsZWN0ZWRfZ2VuZXMpDQoNCmBgYA0KDQpgYGB7ciwgZmlnLmhlaWdodD0zLCBmaWcud2lkdGg9MTAsIGVjaG89RkFMU0V9DQoNCiMjZGVmaW5lIHRoZSBjb2xvcnMgZm9yIHRoZSBoZWF0bWFwIChjYXRlZ29yaWNhbCk6IDEgY29sb3IgZm9yIGVhY2ggc21hbGxlc3QgZXhwZXJpbWVudGFsIHVuaXQgdGhhdCBpcyBiZWluZyAgY29tcGFyZWQ7IGkuZS4gaGVyZSB0aGUgdHJlYXRtZW50DQpjb2xvcl9jYXRlZ29yaWNhbF9oZWF0bWFwIDwtIGNvbG9yX2NhdGVnb3JpY2FsX3RyZWF0bWVudA0KI25hbWUgdGhpcyBsaXN0IG9mIGNvbG9yIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgbmFtZXMgKG5vdGU6IHRoZXNlIGFyZSB0aGUgdW5pcXVlIHZhbHVlcyBmb3IgdGhhdCBjYXRlZ29yeSBpbiB0aGUgc2FtcGxlIG1ldGFkYXRhKQ0KY29sb3JfY2F0ZWdvcmljYWxfaGVhdG1hcF9uYW1lZCA8LSBjb2xvcl9jYXRlZ29yaWNhbF9oZWF0bWFwDQpuYW1lcyhjb2xvcl9jYXRlZ29yaWNhbF9oZWF0bWFwX25hbWVkKSA8LSB1bmlxdWUoc2FtcGxlX21ldGFkYXRhJHRyZWF0bWVudCkNCg0KI2xvYWQgdGhpcyBpbmZvcm1hdGlvbiBpbnRvIHRoZSBoZWF0bWFwDQpjb2xBbm4gPC0gSGVhdG1hcEFubm90YXRpb24oI2RmID0gZGF0YS5mcmFtZSh0cmVhdG1lbnQgPSBzYW1wbGVfbWV0YWRhdGEkdHJlYXRtZW50KSwgI3RoZSBuYW1lIG9mIHRoZSBjb2x1bW4gbmVlZHMgdG8gbWF0Y2ggdGhlIG5hbWUgb2YgdGhlIG5hbWVkIGxpc3QNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjY29sID0gbGlzdCgidHJlYXRtZW50IiA9IGNvbG9yX2NhdGVnb3JpY2FsX2hlYXRtYXBfbmFtZWQpLCAjc2V0IHRoZSBuYW1lIG9mIHRoZSBuYW1lZCBsaXN0IHNvIGl0IG1hdGNoZXMNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjYW5ub3RhdGlvbl93aWR0aCA9IHVuaXQoYygxLCA0KSwgJ2NtJyksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgI2dhcCA9IHVuaXQoMSwgJ21tJykNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG93X2xlZ2VuZCA9IEZBTFNFLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3dfYW5ub3RhdGlvbl9uYW1lID0gRkFMU0UsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2ggPSAnY29sJywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjYWxzbyBjcmVhdGUgYW4gZW1wdHkgcm93IGFib2UgdGhlIGhlYXRtYXAsIHRvIGRpc3BsYXkgYWRkaXRpb25hbCBpbmZvDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1wdHkxID0gYW5ub19lbXB0eShib3JkZXIgPSBGQUxTRSwgaGVpZ2h0PSB1bml0KDgsICJtbSIpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICkNCg0KDQpIZWF0bWFwKG1hdCA9IHQoc2NhbGUodChjb3VudHNfVlNUX3NlbGVjdGVkZ2VuZXMpKSksDQogICAgICAgIG5hbWU9ICJ6LXNjb3JlIiwNCiAgICAgICAgY29sdW1uX3RpdGxlID0gZ3RfcmVuZGVyKA0KICAgICAgICAgICJQYXR0ZXJuIG9mIGV4cHJlc3Npb24gKGFzIDxzcGFuIHN0eWxlPSdjb2xvcjpicm93bjInPioqei1zY29yZXMqKjwvc3Bhbj4pIDxici8+IG9mIGlyaWRvcGhvcmUgZ2VuZXMiDQogICAgICAgICAgKSwNCiAgICAgICAgY29sID0gcmV2KGJyZXdlci5wYWwoMTEsIlJkQnUiKSksDQogICAgICAgIG5hX2NvbCA9ICJibGFjayIsDQogICAgICAgIGNsdXN0ZXJfcm93cyA9IFQsDQogICAgICAgIHNob3dfcm93X2RlbmQgPSBULA0KICAgICAgICAjcm93X29yZGVyID0gb3JkZXJlZF9sZXZlbHMsDQogICAgICAgIGNsdXN0ZXJfY29sdW1ucyA9IEZBTFNFLA0KICAgICAgICBzaG93X2NvbHVtbl9kZW5kID0gRkFMU0UsDQogICAgICAgICNjb2x1bW5fb3JkZXIgPSBvcmRlcmVkX2xldmVscywNCiAgICAgICAgI3Jvd19zcGxpdCA9IGZhY3RvcihwYXN0ZTAoc2FtcGxlX21ldGFkYXRhJHNlZ21lbnQsIHNhbXBsZV9tZXRhZGF0YSRzdGFnZSksIGxldmVscyA9IGMoImxpdmVyUzEiLCAibGl2ZXJTNCIsICJsaXZlclM3IiwgInN0b21hY2hTMSIsICJpbnRlc3RpbmVTMSIsICJzdG9tYWNoUzQiLCAiQV9pbnRlc3RpbmVTNCIsICJQX2ludGVzdGluZVM0IiwgInN0b21hY2hTNyIsICJBX2ludGVzdGluZVM3IiwgIlBfaW50ZXN0aW5lUzciKSksDQogICAgICAgIGNvbHVtbl9zcGxpdCA9IGZhY3RvcihzYW1wbGVfbWV0YWRhdGEkdHJlYXRtZW50LCBsZXZlbHMgPSBjKCJETVNPIiwgIlQzSU9QIiwgIk1QSSIsICJDUEYiLCAiQ1BGLlQzSU9QIikpLA0KICAgICAgICAjY2x1c3Rlcl9yb3dfc2xpY2VzID0gRkFMU0UsDQogICAgICAgIGNsdXN0ZXJfY29sdW1uX3NsaWNlcyA9IEZBTFNFLA0KICAgICAgICByb3dfdGl0bGUgPSBOVUxMLA0KICAgICAgICByb3dfZ2FwID0gdW5pdCgwLjUsICJtbSIpLA0KICAgICAgICBjb2x1bW5fZ2FwID0gdW5pdChjKHJlcCgxMCwxKSwgcmVwKDIsMykpLCAibW0iKSwNCiAgICAgICAgI3dpZHRoID0gdW5pdCg4LCAiY20iKSwgDQogICAgICAgICNoZWlnaHQgPSB1bml0KDgsICJjbSIpLA0KICAgICAgICBjb2x1bW5fbmFtZXNfZ3AgPSBncmlkOjpncGFyKGZvbnRzaXplID0gOCksDQogICAgICAgIHJvd19uYW1lc19ncCA9IGdyaWQ6OmdwYXIoZm9udHNpemUgPSA4KSwNCiAgICAgICAgdG9wX2Fubm90YXRpb24gPSBjb2xBbm4sDQogICAgICAgICNsZWZ0X2Fubm90YXRpb24gPSByb3dBbm4sDQogICAgICAgIHNob3dfaGVhdG1hcF9sZWdlbmQgPSBUUlVFLA0KICAgICAgICBib3JkZXIgPSBUUlVFLA0KICAgICAgICBjbHVzdGVyaW5nX21ldGhvZF9yb3dzID0gJ3dhcmQuRDInDQogICAgICAgICkNCg0KDQpsaWJyYXJ5KEdldG9wdExvbmcpICAjIGZvciB0aGUgZnVuY3Rpb24gcXEoKQ0KZ3JvdXBfYmxvY2tfYW5ubyA9IGZ1bmN0aW9uKGdyb3VwLCBlbXB0eV9hbm5vLCBncCA9IGdwYXIoKSwgDQogICAgbGFiZWwgPSBOVUxMLCBsYWJlbF9ncCA9IGdwYXIoKSkgew0KDQogICAgc2Vla1ZpZXdwb3J0KHFxKCJhbm5vdGF0aW9uX0B7ZW1wdHlfYW5ub31fQHttaW4oZ3JvdXApfSIpKQ0KICAgIGxvYzEgPSBkZXZpY2VMb2MoeCA9IHVuaXQoMCwgIm5wYyIpLCB5ID0gdW5pdCgwLCAibnBjIikpDQogICAgc2Vla1ZpZXdwb3J0KHFxKCJhbm5vdGF0aW9uX0B7ZW1wdHlfYW5ub31fQHttYXgoZ3JvdXApfSIpKQ0KICAgIGxvYzIgPSBkZXZpY2VMb2MoeCA9IHVuaXQoMSwgIm5wYyIpLCB5ID0gdW5pdCgxLCAibnBjIikpDQoNCiAgICBzZWVrVmlld3BvcnQoImdsb2JhbCIpDQogICAgZ3JpZC5yZWN0KGxvYzEkeCwgbG9jMSR5LCB3aWR0aCA9IGxvYzIkeCAtIGxvYzEkeCwgaGVpZ2h0ID0gbG9jMiR5IC0gbG9jMSR5LCANCiAgICAgICAganVzdCA9IGMoImxlZnQiLCAiYm90dG9tIiksIGdwID0gZ3ApDQogICAgaWYoIWlzLm51bGwobGFiZWwpKSB7DQogICAgICAgIGdyaWQudGV4dChsYWJlbCwgeCA9IChsb2MxJHggKyBsb2MyJHgpKjAuNSwgeSA9IChsb2MxJHkgKyBsb2MyJHkpKjAuNSwgZ3AgPSBsYWJlbF9ncCkNCiAgICB9DQp9DQoNCmdyb3VwX2Jsb2NrX2Fubm8oMToxLCAiZW1wdHkxIiwgZ3AgPSBncGFyKGZpbGwgPSAiZ3JheTcwIiksIGxhYmVsID0gIkRNU08iKQ0KZ3JvdXBfYmxvY2tfYW5ubygyOjIsICJlbXB0eTEiLCBncCA9IGdwYXIoZmlsbCA9ICJwYWxlZ3JlZW4zIiksIGxhYmVsID0gIlQzK0lPUCIpDQpncm91cF9ibG9ja19hbm5vKDM6MywgImVtcHR5MSIsIGdwID0gZ3BhcihmaWxsID0gImxpZ2h0Y29yYWwiKSwgbGFiZWwgPSAiTVBJIikNCmdyb3VwX2Jsb2NrX2Fubm8oNDo0LCAiZW1wdHkxIiwgZ3AgPSBncGFyKGZpbGwgPSAibGlnaHRza3libHVlIiksIGxhYmVsID0gIkNQRiIpDQpncm91cF9ibG9ja19hbm5vKDU6NSwgImVtcHR5MSIsIGdwID0gZ3BhcihmaWxsID0gIm9yY2hpZDIiKSwgbGFiZWwgPSAiQ1BGK1QzK0lPUCIpDQoNCg0KYGBgDQoNCg0KDQojIyMjIyBOTUogZ2VuZXMNCg0KYGBge3IsIGVjaG89RkFMU0V9DQojbG9hZCB0aGUgY291bnRzX1ZTVCBvYmplY3QNCmxvYWQoIkQ6Ly9Bb2NlbGxhcmlzX0NQRl9NUElfVDMvU2F2ZWRfb2JqZWN0cy9jb3VudHNfVlNULnJkcyIpDQpgYGANCg0KYGBge3IsIGVjaG89RkFMU0V9DQojc2VsZWN0IGdlbmVzDQoNCmdlbmVsaXN0IDwtIGMoIjExMTU2NjI1MSIsIA0KICAgICAgICAgICAgICAiMTExNTY4MTg1IiwgDQogICAgICAgICAgICAgICIxMTE1NzE5MzIiLCANCiAgICAgICAgICAgICAgIjExMTU3NzMyOSIsIA0KICAgICAgICAgICAgICAiMTExNTgxODY1IiwgDQogICAgICAgICAgICAgICIxMTE1NjYyNTAiLCAjbWF0dXJlIG9zdGVvYmxhc3RzDQogICAgICAgICAgICAgICIxMTE1NjYyNTMiLA0KICAgICAgICAgICAgICAiMTExNTc1MzkwIiwgDQogICAgICAgICAgICAgICIxMTE1NzczMzAiLCAjZGV2ZWxvcGluZyBib255IGVsZW1lbnRzIGFuZCBlY3RvZGVybQ0KICAgICAgICAgICAgICAiMTExNTgxMTEzIiwNCiAgICAgICAgICAgICAgIjExMTU4Mzk2MiIsDQogICAgICAgICAgICAgICIxMTE1ODM5NjgiLA0KICAgICAgICAgICAgICAiMTExNTgxODc3IiwNCiAgICAgICAgICAgICAgIjExMTU2NzY1OSIsDQogICAgICAgICAgICAgICIxMTE1ODg4MzEiDQogICAgICAgICAgICAgIA0KICAgICAgICAgICAgICApDQoNCg0KDQojYW5ub3RhdGlvbl9pbmZvW2Fubm90YXRpb25faW5mbyRlbnNlbWJsX0lEICVpbiUgZ2VuZWxpc3QsYygiZW5zZW1ibF9JRCIsICJlbnRyZXpfSUQiKV0NCg0KDQoNCnNlbGVjdGVkX2dlbmVzIDwtIGMoZ2VuZWxpc3QpDQoNCg0KDQojdGhlIHN1YnNldCBhYm92ZSB3YXMgY2hvc2VuIGJhc2VkIG9uIHRoZSBlbnNlbWJsZSBhbm5vdGF0aW9uLiBjb252ZXJ0IHRvIE5DQkkNCiNzZWxlY3RlZF9nZW5lcyA8LSBhbm5vdGF0aW9uX2luZm8kZW50cmV6X0lEW21hdGNoKHNlbGVjdGVkX2dlbmVzLCBhbm5vdGF0aW9uX2luZm8kZW5zZW1ibF9JRCldDQoNCg0KYGBgDQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KI29ubHkga2VlcCBDUEYgREUgZ2VuZXMNCmxvYWQoIkQ6Ly9Bb2NlbGxhcmlzX0NQRl9NUElfVDMvU2F2ZWRfb2JqZWN0cy9DUEZfZG93bnJlZ3VsYXRlZF9nZW5lcy5yZHMiKQ0KbG9hZCgiRDovL0FvY2VsbGFyaXNfQ1BGX01QSV9UMy9TYXZlZF9vYmplY3RzL0NQRl91cHJlZ3VsYXRlZF9nZW5lcy5yZHMiKQ0KDQpzZWxlY3RlZF9nZW5lcyA8LSBzZWxlY3RlZF9nZW5lc1tzZWxlY3RlZF9nZW5lcyAlaW4lIHVuaW9uKENQRl9kb3ducmVndWxhdGVkLCBDUEZfdXByZWd1bGF0ZWQpXSAjb25seSBvbmUNCmBgYA0KDQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KIyBSZXR1cm5zIHRoZSBtaXNzaW5nIGdlbmVzOg0KbWlzc2luZ19nZW5lcyA8LSBhcy5kYXRhLmZyYW1lKHNldGRpZmYoc2VsZWN0ZWRfZ2VuZXMsIHJvdy5uYW1lcyhjb3VudHNfVlNUKSkpIA0KY29sbmFtZXMobWlzc2luZ19nZW5lcykgPC0gImVudHJlel9JRCINCm1pc3NpbmdfZ2VuZXMkZGVzY3JpcHRpb24gPC0gYW5ub3RhdGlvbl9pbmZvJG1lcmdlZF9kZXNjcmlwdGlvblttYXRjaChtaXNzaW5nX2dlbmVzJGVudHJlel9JRCxhbm5vdGF0aW9uX2luZm8kZW50cmV6X0lEKV0NCiNubyBtaXNzaW5nIGdlbmVzDQoNCiMgUmV0dXJucyB0aGUgZXhpc3RpbmcgZ2VuZXM6DQpzZWxlY3RlZF9nZW5lcyA8LSBhcy5kYXRhLmZyYW1lKGludGVyc2VjdChzZWxlY3RlZF9nZW5lcywgcm93Lm5hbWVzKGNvdW50c19WU1QpKSkNCmNvbG5hbWVzKHNlbGVjdGVkX2dlbmVzKSA8LSAiZW50cmV6X0lEIg0Kc2VsZWN0ZWRfZ2VuZXMkZGVzY3JpcHRpb24gPC0gYW5ub3RhdGlvbl9pbmZvJG1lcmdlZF9kZXNjcmlwdGlvblttYXRjaChzZWxlY3RlZF9nZW5lcyRlbnRyZXpfSUQsYW5ub3RhdGlvbl9pbmZvJGVudHJlel9JRCldDQoNCiNwcmludCBsaXN0IG9mIGRpY2FyZGVkIGdlbmVzIChiZWNhdXNlIG1pc3NpbmcpIGFuZCBvZiByZXRhaW5lZCBnZW5lcyAoY3VyYXRlZCBkaWdlc3Rpb24gZ2VuZXMsIHByZXNlbnQgaW4gdGhlIGRhdGFzZXQpDQoNCiNrYWJsZShtaXNzaW5nX2dlbmVzLCBjYXB0aW9uID0gIkdlbmVzIG1pc3NpbmcgZnJvbSB0aGUgZGF0YXNldCAoaWdub3JlZCkiKQ0Ka2FibGUoc2VsZWN0ZWRfZ2VuZXMsIGNhcHRpb24gPSAiR2VuZXMgcHJlc2VudCBpbiB0aGUgZGF0YXNldCAocmV0YWluZWQpIikNCg0KIyMgc3Vic2V0IHRoZSBvcmlnaW5hbCBWU1Qgb2JqZWN0cyB0byBvbmx5IGtlZXAgc2VsZWN0ZWQgZ2VuZXMNCmNvdW50c19WU1Rfc2VsZWN0ZWRnZW5lcyA8LSBzdWJzZXQoY291bnRzX1ZTVCwgcm93bmFtZXMoY291bnRzX1ZTVCkgJWluJSBzZWxlY3RlZF9nZW5lcyRlbnRyZXpfSUQpDQpyb3duYW1lcyhjb3VudHNfVlNUX3NlbGVjdGVkZ2VuZXMpIDwtIGFubm90YXRpb25faW5mbyRtZXJnZWRfZGVzY3JpcHRpb25bbWF0Y2gocm93bmFtZXMoY291bnRzX1ZTVF9zZWxlY3RlZGdlbmVzKSwgYW5ub3RhdGlvbl9pbmZvJGVudHJlel9JRCldDQoNCiNyZW1vdmUgdW51c2VkIHZhcmlhYmxlcw0Kcm0oc2VsZWN0ZWRfZ2VuZXMpDQoNCmBgYA0KDQpgYGB7ciwgZmlnLmhlaWdodD0zLCBmaWcud2lkdGg9MTAsIGVjaG89RkFMU0V9DQoNCiMjZGVmaW5lIHRoZSBjb2xvcnMgZm9yIHRoZSBoZWF0bWFwIChjYXRlZ29yaWNhbCk6IDEgY29sb3IgZm9yIGVhY2ggc21hbGxlc3QgZXhwZXJpbWVudGFsIHVuaXQgdGhhdCBpcyBiZWluZyAgY29tcGFyZWQ7IGkuZS4gaGVyZSB0aGUgdHJlYXRtZW50DQpjb2xvcl9jYXRlZ29yaWNhbF9oZWF0bWFwIDwtIGNvbG9yX2NhdGVnb3JpY2FsX3RyZWF0bWVudA0KI25hbWUgdGhpcyBsaXN0IG9mIGNvbG9yIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgbmFtZXMgKG5vdGU6IHRoZXNlIGFyZSB0aGUgdW5pcXVlIHZhbHVlcyBmb3IgdGhhdCBjYXRlZ29yeSBpbiB0aGUgc2FtcGxlIG1ldGFkYXRhKQ0KY29sb3JfY2F0ZWdvcmljYWxfaGVhdG1hcF9uYW1lZCA8LSBjb2xvcl9jYXRlZ29yaWNhbF9oZWF0bWFwDQpuYW1lcyhjb2xvcl9jYXRlZ29yaWNhbF9oZWF0bWFwX25hbWVkKSA8LSB1bmlxdWUoc2FtcGxlX21ldGFkYXRhJHRyZWF0bWVudCkNCg0KI2xvYWQgdGhpcyBpbmZvcm1hdGlvbiBpbnRvIHRoZSBoZWF0bWFwDQpjb2xBbm4gPC0gSGVhdG1hcEFubm90YXRpb24oI2RmID0gZGF0YS5mcmFtZSh0cmVhdG1lbnQgPSBzYW1wbGVfbWV0YWRhdGEkdHJlYXRtZW50KSwgI3RoZSBuYW1lIG9mIHRoZSBjb2x1bW4gbmVlZHMgdG8gbWF0Y2ggdGhlIG5hbWUgb2YgdGhlIG5hbWVkIGxpc3QNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjY29sID0gbGlzdCgidHJlYXRtZW50IiA9IGNvbG9yX2NhdGVnb3JpY2FsX2hlYXRtYXBfbmFtZWQpLCAjc2V0IHRoZSBuYW1lIG9mIHRoZSBuYW1lZCBsaXN0IHNvIGl0IG1hdGNoZXMNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjYW5ub3RhdGlvbl93aWR0aCA9IHVuaXQoYygxLCA0KSwgJ2NtJyksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgI2dhcCA9IHVuaXQoMSwgJ21tJykNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG93X2xlZ2VuZCA9IEZBTFNFLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3dfYW5ub3RhdGlvbl9uYW1lID0gRkFMU0UsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2ggPSAnY29sJywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjYWxzbyBjcmVhdGUgYW4gZW1wdHkgcm93IGFib2UgdGhlIGhlYXRtYXAsIHRvIGRpc3BsYXkgYWRkaXRpb25hbCBpbmZvDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1wdHkxID0gYW5ub19lbXB0eShib3JkZXIgPSBGQUxTRSwgaGVpZ2h0PSB1bml0KDgsICJtbSIpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICkNCg0KDQpIZWF0bWFwKG1hdCA9IHQoc2NhbGUodChjb3VudHNfVlNUX3NlbGVjdGVkZ2VuZXMpKSksDQogICAgICAgIG5hbWU9ICJ6LXNjb3JlIiwNCiAgICAgICAgY29sdW1uX3RpdGxlID0gZ3RfcmVuZGVyKA0KICAgICAgICAgICJQYXR0ZXJuIG9mIGV4cHJlc3Npb24gKGFzIDxzcGFuIHN0eWxlPSdjb2xvcjpicm93bjInPioqei1zY29yZXMqKjwvc3Bhbj4pIDxici8+IG9mIE5NSiBnZW5lcyINCiAgICAgICAgICApLA0KICAgICAgICBjb2wgPSByZXYoYnJld2VyLnBhbCgxMSwiUmRCdSIpKSwNCiAgICAgICAgbmFfY29sID0gImJsYWNrIiwNCiAgICAgICAgY2x1c3Rlcl9yb3dzID0gVCwNCiAgICAgICAgc2hvd19yb3dfZGVuZCA9IFQsDQogICAgICAgICNyb3dfb3JkZXIgPSBvcmRlcmVkX2xldmVscywNCiAgICAgICAgY2x1c3Rlcl9jb2x1bW5zID0gRkFMU0UsDQogICAgICAgIHNob3dfY29sdW1uX2RlbmQgPSBGQUxTRSwNCiAgICAgICAgI2NvbHVtbl9vcmRlciA9IG9yZGVyZWRfbGV2ZWxzLA0KICAgICAgICAjcm93X3NwbGl0ID0gZmFjdG9yKHBhc3RlMChzYW1wbGVfbWV0YWRhdGEkc2VnbWVudCwgc2FtcGxlX21ldGFkYXRhJHN0YWdlKSwgbGV2ZWxzID0gYygibGl2ZXJTMSIsICJsaXZlclM0IiwgImxpdmVyUzciLCAic3RvbWFjaFMxIiwgImludGVzdGluZVMxIiwgInN0b21hY2hTNCIsICJBX2ludGVzdGluZVM0IiwgIlBfaW50ZXN0aW5lUzQiLCAic3RvbWFjaFM3IiwgIkFfaW50ZXN0aW5lUzciLCAiUF9pbnRlc3RpbmVTNyIpKSwNCiAgICAgICAgY29sdW1uX3NwbGl0ID0gZmFjdG9yKHNhbXBsZV9tZXRhZGF0YSR0cmVhdG1lbnQsIGxldmVscyA9IGMoIkRNU08iLCAiVDNJT1AiLCAiTVBJIiwgIkNQRiIsICJDUEYuVDNJT1AiKSksDQogICAgICAgICNjbHVzdGVyX3Jvd19zbGljZXMgPSBGQUxTRSwNCiAgICAgICAgY2x1c3Rlcl9jb2x1bW5fc2xpY2VzID0gRkFMU0UsDQogICAgICAgIHJvd190aXRsZSA9IE5VTEwsDQogICAgICAgIHJvd19nYXAgPSB1bml0KDAuNSwgIm1tIiksDQogICAgICAgIGNvbHVtbl9nYXAgPSB1bml0KGMocmVwKDEwLDEpLCByZXAoMiwzKSksICJtbSIpLA0KICAgICAgICAjd2lkdGggPSB1bml0KDgsICJjbSIpLCANCiAgICAgICAgI2hlaWdodCA9IHVuaXQoOCwgImNtIiksDQogICAgICAgIGNvbHVtbl9uYW1lc19ncCA9IGdyaWQ6OmdwYXIoZm9udHNpemUgPSA4KSwNCiAgICAgICAgcm93X25hbWVzX2dwID0gZ3JpZDo6Z3Bhcihmb250c2l6ZSA9IDgpLA0KICAgICAgICB0b3BfYW5ub3RhdGlvbiA9IGNvbEFubiwNCiAgICAgICAgI2xlZnRfYW5ub3RhdGlvbiA9IHJvd0FubiwNCiAgICAgICAgc2hvd19oZWF0bWFwX2xlZ2VuZCA9IEYsDQogICAgICAgIGJvcmRlciA9IFRSVUUsDQogICAgICAgIGNsdXN0ZXJpbmdfbWV0aG9kX3Jvd3MgPSAnd2FyZC5EMicNCiAgICAgICAgKQ0KDQoNCmxpYnJhcnkoR2V0b3B0TG9uZykgICMgZm9yIHRoZSBmdW5jdGlvbiBxcSgpDQpncm91cF9ibG9ja19hbm5vID0gZnVuY3Rpb24oZ3JvdXAsIGVtcHR5X2Fubm8sIGdwID0gZ3BhcigpLCANCiAgICBsYWJlbCA9IE5VTEwsIGxhYmVsX2dwID0gZ3BhcigpKSB7DQoNCiAgICBzZWVrVmlld3BvcnQocXEoImFubm90YXRpb25fQHtlbXB0eV9hbm5vfV9Ae21pbihncm91cCl9IikpDQogICAgbG9jMSA9IGRldmljZUxvYyh4ID0gdW5pdCgwLCAibnBjIiksIHkgPSB1bml0KDAsICJucGMiKSkNCiAgICBzZWVrVmlld3BvcnQocXEoImFubm90YXRpb25fQHtlbXB0eV9hbm5vfV9Ae21heChncm91cCl9IikpDQogICAgbG9jMiA9IGRldmljZUxvYyh4ID0gdW5pdCgxLCAibnBjIiksIHkgPSB1bml0KDEsICJucGMiKSkNCg0KICAgIHNlZWtWaWV3cG9ydCgiZ2xvYmFsIikNCiAgICBncmlkLnJlY3QobG9jMSR4LCBsb2MxJHksIHdpZHRoID0gbG9jMiR4IC0gbG9jMSR4LCBoZWlnaHQgPSBsb2MyJHkgLSBsb2MxJHksIA0KICAgICAgICBqdXN0ID0gYygibGVmdCIsICJib3R0b20iKSwgZ3AgPSBncCkNCiAgICBpZighaXMubnVsbChsYWJlbCkpIHsNCiAgICAgICAgZ3JpZC50ZXh0KGxhYmVsLCB4ID0gKGxvYzEkeCArIGxvYzIkeCkqMC41LCB5ID0gKGxvYzEkeSArIGxvYzIkeSkqMC41LCBncCA9IGxhYmVsX2dwKQ0KICAgIH0NCn0NCg0KZ3JvdXBfYmxvY2tfYW5ubygxOjEsICJlbXB0eTEiLCBncCA9IGdwYXIoZmlsbCA9ICJncmF5NzAiKSwgbGFiZWwgPSAiRE1TTyIpDQpncm91cF9ibG9ja19hbm5vKDI6MiwgImVtcHR5MSIsIGdwID0gZ3BhcihmaWxsID0gInBhbGVncmVlbjMiKSwgbGFiZWwgPSAiVDMrSU9QIikNCmdyb3VwX2Jsb2NrX2Fubm8oMzozLCAiZW1wdHkxIiwgZ3AgPSBncGFyKGZpbGwgPSAibGlnaHRjb3JhbCIpLCBsYWJlbCA9ICJNUEkiKQ0KZ3JvdXBfYmxvY2tfYW5ubyg0OjQsICJlbXB0eTEiLCBncCA9IGdwYXIoZmlsbCA9ICJsaWdodHNreWJsdWUiKSwgbGFiZWwgPSAiQ1BGIikNCmdyb3VwX2Jsb2NrX2Fubm8oNTo1LCAiZW1wdHkxIiwgZ3AgPSBncGFyKGZpbGwgPSAib3JjaGlkMiIpLCBsYWJlbCA9ICJDUEYrVDMrSU9QIikNCg0KDQpgYGANCg0KIyMjIyMgQ2hvbGVzdGVyb2wNCg0KYGBge3IsIGVjaG89RkFMU0V9DQojbG9hZCB0aGUgY291bnRzX1ZTVCBvYmplY3QNCmxvYWQoIkQ6Ly9Bb2NlbGxhcmlzX0NQRl9NUElfVDMvU2F2ZWRfb2JqZWN0cy9jb3VudHNfVlNULnJkcyIpDQpgYGANCg0KYGBge3IsIGVjaG89RkFMU0V9DQojc2VsZWN0IGdlbmVzDQoNCmdlbmVsaXN0IDwtIGMoIjExMTU2NDgwMCIsICNhY2V0eWxDb0EgdG8gbGFub3N0ZXJvbA0KICAgICAgICAgICAgICAiMTExNTcwMzU2IiwgDQogICAgICAgICAgICAgICIxMTE1NzUzNDgiLCAiMTExNTc5MzI4IiwNCiAgICAgICAgICAgICAgIjExMTU2ODMxMCIsIA0KICAgICAgICAgICAgICAiMTExNTY5NDc4IiwgDQogICAgICAgICAgICAgICIxMTE1NzcxNjYiLCANCiAgICAgICAgICAgICAgIjExMTU2NTI3OCIsDQogICAgICAgICAgICAgICIxMTE1NzE5NzgiLCANCiAgICAgICAgICAgICAgIjExMTU2OTkzNyIsIA0KICAgICAgICAgICAgICAiMTExNTYyOTM4IiwNCiAgICAgICAgICAgICAgIjExMTU4Mjg2MCIsDQogICAgICAgICAgICAgIA0KICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgIjExMTU4MTEyNSIsICNsYW5vc3Rlcm9sIHRvIGNob2xlc3Rlcm9sDQogICAgICAgICAgICAgICIxMTE1NjUwNzUiLA0KICAgICAgICAgICAgICAiMTExNTcyNjE1IiwgIjExMTU4MzQ4OCIsICM9PURIQ1IxNA0KICAgICAgICAgICAgICAiMTExNTc0NzA5IiwgIjExMTU2NTU4MiIsICIxMTE1NjM1ODIiLCAiMTExNTg2OTk5IiwgIjExMTU3NDU3MiIsICNDNCBkZW1ldGh5bGF0aW9uIGNvbXBsZXgNCiAgICAgICAgICAgICAgIjExMTU4MDY4NiIsICIxMTE1ODQ0NTkiLA0KICAgICAgICAgICAgICAiMTExNTY4MTI0IiwgIjExMTU3MzkwNiIsDQogICAgICAgICAgICAgICIxMTE1NjcyMDAiLA0KICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgIjExMTU3MDkzMSIsICIxMTE1NzI4ODQiLCAjY2hvbGVzdGVyb2wgZXhwb3J0L3VzZQ0KICAgICAgICAgICAgICAiMTExNTYzODk5IiwgIjExMTU4Mzc4NSIsDQogICAgICAgICAgICAgICIxMTE1Njg1MzAiLA0KICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgIjExMTU2MzI3NiIsICN2aXRhbWluRDMgQ2hvbGVjYWxjaWZlcm9sIHRvIGNhbGNpdHJpb2wNCiAgICAgICAgICAgICAgIjExMTU4NzYzOSIsDQogICAgICAgICAgICAgICIxMTE1Nzk2MjQiLA0KICAgICAgICAgICAgICAiMTExNTc3MDA1IiwgIjExMTU2NTg4NiINCiAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICkNCg0KDQoNCiNhbm5vdGF0aW9uX2luZm9bYW5ub3RhdGlvbl9pbmZvJGVuc2VtYmxfSUQgJWluJSBnZW5lbGlzdCxjKCJlbnNlbWJsX0lEIiwgImVudHJlel9JRCIpXQ0KDQoNCg0Kc2VsZWN0ZWRfZ2VuZXMgPC0gYyhnZW5lbGlzdCkNCg0KDQoNCiN0aGUgc3Vic2V0IGFib3ZlIHdhcyBjaG9zZW4gYmFzZWQgb24gdGhlIGVuc2VtYmxlIGFubm90YXRpb24uIGNvbnZlcnQgdG8gTkNCSQ0KI3NlbGVjdGVkX2dlbmVzIDwtIGFubm90YXRpb25faW5mbyRlbnRyZXpfSURbbWF0Y2goc2VsZWN0ZWRfZ2VuZXMsIGFubm90YXRpb25faW5mbyRlbnNlbWJsX0lEKV0NCg0KDQpgYGANCg0KYGBge3IsIGVjaG89RkFMU0V9DQojb25seSBrZWVwIENQRi1ERSBnZW5lcw0KbG9hZCgiRDovL0FvY2VsbGFyaXNfQ1BGX01QSV9UMy9TYXZlZF9vYmplY3RzL0NQRl9kb3ducmVndWxhdGVkX2dlbmVzLnJkcyIpDQpsb2FkKCJEOi8vQW9jZWxsYXJpc19DUEZfTVBJX1QzL1NhdmVkX29iamVjdHMvQ1BGX3VwcmVndWxhdGVkX2dlbmVzLnJkcyIpDQoNCnNlbGVjdGVkX2dlbmVzIDwtIHNlbGVjdGVkX2dlbmVzW3NlbGVjdGVkX2dlbmVzICVpbiUgdW5pb24oQ1BGX2Rvd25yZWd1bGF0ZWQsIENQRl91cHJlZ3VsYXRlZCldICNvbmx5IG9uZQ0KYGBgDQoNCg0KYGBge3IsIGVjaG89RkFMU0V9DQojIFJldHVybnMgdGhlIG1pc3NpbmcgZ2VuZXM6DQptaXNzaW5nX2dlbmVzIDwtIGFzLmRhdGEuZnJhbWUoc2V0ZGlmZihzZWxlY3RlZF9nZW5lcywgcm93Lm5hbWVzKGNvdW50c19WU1QpKSkgDQpjb2xuYW1lcyhtaXNzaW5nX2dlbmVzKSA8LSAiZW50cmV6X0lEIg0KbWlzc2luZ19nZW5lcyRkZXNjcmlwdGlvbiA8LSBhbm5vdGF0aW9uX2luZm8kbWVyZ2VkX2Rlc2NyaXB0aW9uW21hdGNoKG1pc3NpbmdfZ2VuZXMkZW50cmV6X0lELGFubm90YXRpb25faW5mbyRlbnRyZXpfSUQpXQ0KI25vIG1pc3NpbmcgZ2VuZXMNCg0KIyBSZXR1cm5zIHRoZSBleGlzdGluZyBnZW5lczoNCnNlbGVjdGVkX2dlbmVzIDwtIGFzLmRhdGEuZnJhbWUoaW50ZXJzZWN0KHNlbGVjdGVkX2dlbmVzLCByb3cubmFtZXMoY291bnRzX1ZTVCkpKQ0KY29sbmFtZXMoc2VsZWN0ZWRfZ2VuZXMpIDwtICJlbnRyZXpfSUQiDQpzZWxlY3RlZF9nZW5lcyRkZXNjcmlwdGlvbiA8LSBhbm5vdGF0aW9uX2luZm8kbWVyZ2VkX2Rlc2NyaXB0aW9uW21hdGNoKHNlbGVjdGVkX2dlbmVzJGVudHJlel9JRCxhbm5vdGF0aW9uX2luZm8kZW50cmV6X0lEKV0NCg0KI3ByaW50IGxpc3Qgb2YgZGljYXJkZWQgZ2VuZXMgKGJlY2F1c2UgbWlzc2luZykgYW5kIG9mIHJldGFpbmVkIGdlbmVzIChjdXJhdGVkIGRpZ2VzdGlvbiBnZW5lcywgcHJlc2VudCBpbiB0aGUgZGF0YXNldCkNCg0KI2thYmxlKG1pc3NpbmdfZ2VuZXMsIGNhcHRpb24gPSAiR2VuZXMgbWlzc2luZyBmcm9tIHRoZSBkYXRhc2V0IChpZ25vcmVkKSIpDQprYWJsZShzZWxlY3RlZF9nZW5lcywgY2FwdGlvbiA9ICJHZW5lcyBwcmVzZW50IGluIHRoZSBkYXRhc2V0IChyZXRhaW5lZCkiKQ0KDQojIyBzdWJzZXQgdGhlIG9yaWdpbmFsIFZTVCBvYmplY3RzIHRvIG9ubHkga2VlcCBzZWxlY3RlZCBnZW5lcw0KY291bnRzX1ZTVF9zZWxlY3RlZGdlbmVzIDwtIHN1YnNldChjb3VudHNfVlNULCByb3duYW1lcyhjb3VudHNfVlNUKSAlaW4lIHNlbGVjdGVkX2dlbmVzJGVudHJlel9JRCkNCnJvd25hbWVzKGNvdW50c19WU1Rfc2VsZWN0ZWRnZW5lcykgPC0gYW5ub3RhdGlvbl9pbmZvJG1lcmdlZF9kZXNjcmlwdGlvblttYXRjaChyb3duYW1lcyhjb3VudHNfVlNUX3NlbGVjdGVkZ2VuZXMpLCBhbm5vdGF0aW9uX2luZm8kZW50cmV6X0lEKV0NCg0KI3JlbW92ZSB1bnVzZWQgdmFyaWFibGVzDQojcm0oc2VsZWN0ZWRfZ2VuZXMpDQoNCmBgYA0KDQpgYGB7ciwgZWNobz1GQUxTRX0NCiNzb3J0IGdlbmVzIGJhc2VkIG9uIG1ldGFib2xpYyBwYXRod2F5DQpjb3VudHNfVlNUX3NlbGVjdGVkZ2VuZXNfc29ydGVkIDwtIGNvdW50c19WU1Rfc2VsZWN0ZWRnZW5lcw0KY291bnRzX1ZTVF9zZWxlY3RlZGdlbmVzX3NvcnRlZCA8LSBjb3VudHNfVlNUX3NlbGVjdGVkZ2VuZXNfc29ydGVkW21hdGNoKHNlbGVjdGVkX2dlbmVzJGRlc2NyaXB0aW9uLCByb3duYW1lcyhjb3VudHNfVlNUX3NlbGVjdGVkZ2VuZXNfc29ydGVkKSksIF0NCmBgYA0KDQoNCmBgYHtyLCBmaWcuaGVpZ2h0PTUsIGZpZy53aWR0aD0xMCwgZWNobz1GQUxTRX0NCg0KIyNkZWZpbmUgdGhlIGNvbG9ycyBmb3IgdGhlIGhlYXRtYXAgKGNhdGVnb3JpY2FsKTogMSBjb2xvciBmb3IgZWFjaCBzbWFsbGVzdCBleHBlcmltZW50YWwgdW5pdCB0aGF0IGlzIGJlaW5nICBjb21wYXJlZDsgaS5lLiBoZXJlIHRoZSB0cmVhdG1lbnQNCmNvbG9yX2NhdGVnb3JpY2FsX2hlYXRtYXAgPC0gY29sb3JfY2F0ZWdvcmljYWxfdHJlYXRtZW50DQojbmFtZSB0aGlzIGxpc3Qgb2YgY29sb3Igd2l0aCB0aGUgY29ycmVzcG9uZGluZyBuYW1lcyAobm90ZTogdGhlc2UgYXJlIHRoZSB1bmlxdWUgdmFsdWVzIGZvciB0aGF0IGNhdGVnb3J5IGluIHRoZSBzYW1wbGUgbWV0YWRhdGEpDQpjb2xvcl9jYXRlZ29yaWNhbF9oZWF0bWFwX25hbWVkIDwtIGNvbG9yX2NhdGVnb3JpY2FsX2hlYXRtYXANCm5hbWVzKGNvbG9yX2NhdGVnb3JpY2FsX2hlYXRtYXBfbmFtZWQpIDwtIHVuaXF1ZShzYW1wbGVfbWV0YWRhdGEkdHJlYXRtZW50KQ0KDQojbG9hZCB0aGlzIGluZm9ybWF0aW9uIGludG8gdGhlIGhlYXRtYXANCmNvbEFubiA8LSBIZWF0bWFwQW5ub3RhdGlvbigjZGYgPSBkYXRhLmZyYW1lKHRyZWF0bWVudCA9IHNhbXBsZV9tZXRhZGF0YSR0cmVhdG1lbnQpLCAjdGhlIG5hbWUgb2YgdGhlIGNvbHVtbiBuZWVkcyB0byBtYXRjaCB0aGUgbmFtZSBvZiB0aGUgbmFtZWQgbGlzdA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICNjb2wgPSBsaXN0KCJ0cmVhdG1lbnQiID0gY29sb3JfY2F0ZWdvcmljYWxfaGVhdG1hcF9uYW1lZCksICNzZXQgdGhlIG5hbWUgb2YgdGhlIG5hbWVkIGxpc3Qgc28gaXQgbWF0Y2hlcw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICNhbm5vdGF0aW9uX3dpZHRoID0gdW5pdChjKDEsIDQpLCAnY20nKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjZ2FwID0gdW5pdCgxLCAnbW0nKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3dfbGVnZW5kID0gRkFMU0UsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd19hbm5vdGF0aW9uX25hbWUgPSBGQUxTRSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGljaCA9ICdjb2wnLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICNhbHNvIGNyZWF0ZSBhbiBlbXB0eSByb3cgYWJvZSB0aGUgaGVhdG1hcCwgdG8gZGlzcGxheSBhZGRpdGlvbmFsIGluZm8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbXB0eTEgPSBhbm5vX2VtcHR5KGJvcmRlciA9IEZBTFNFLCBoZWlnaHQ9IHVuaXQoOCwgIm1tIikpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKQ0KDQoNCkhlYXRtYXAobWF0ID0gdChzY2FsZSh0KGNvdW50c19WU1Rfc2VsZWN0ZWRnZW5lc19zb3J0ZWQpKSksDQogICAgICAgIG5hbWU9ICJ6LXNjb3JlIiwNCiAgICAgICAgY29sdW1uX3RpdGxlID0gZ3RfcmVuZGVyKA0KICAgICAgICAgICJQYXR0ZXJuIG9mIGV4cHJlc3Npb24gKGFzIDxzcGFuIHN0eWxlPSdjb2xvcjpicm93bjInPioqei1zY29yZXMqKjwvc3Bhbj4pIDxici8+IG9mIGNob2xlc3Rlcm9sIGFuZCB2aXRhbWluRCBnZW5lcyINCiAgICAgICAgICApLA0KICAgICAgICBjb2wgPSByZXYoYnJld2VyLnBhbCgxMSwiUmRCdSIpKSwNCiAgICAgICAgbmFfY29sID0gImJsYWNrIiwNCiAgICAgICAgY2x1c3Rlcl9yb3dzID0gRiwNCiAgICAgICAgc2hvd19yb3dfZGVuZCA9IEYsDQogICAgICAgICNyb3dfb3JkZXIgPSBvcmRlcmVkX2xldmVscywNCiAgICAgICAgY2x1c3Rlcl9jb2x1bW5zID0gRkFMU0UsDQogICAgICAgIHNob3dfY29sdW1uX2RlbmQgPSBGQUxTRSwNCiAgICAgICAgI2NvbHVtbl9vcmRlciA9IG9yZGVyZWRfbGV2ZWxzLA0KICAgICAgICAjcm93X3NwbGl0ID0gZmFjdG9yKHBhc3RlMChzYW1wbGVfbWV0YWRhdGEkc2VnbWVudCwgc2FtcGxlX21ldGFkYXRhJHN0YWdlKSwgbGV2ZWxzID0gYygibGl2ZXJTMSIsICJsaXZlclM0IiwgImxpdmVyUzciLCAic3RvbWFjaFMxIiwgImludGVzdGluZVMxIiwgInN0b21hY2hTNCIsICJBX2ludGVzdGluZVM0IiwgIlBfaW50ZXN0aW5lUzQiLCAic3RvbWFjaFM3IiwgIkFfaW50ZXN0aW5lUzciLCAiUF9pbnRlc3RpbmVTNyIpKSwNCiAgICAgICAgY29sdW1uX3NwbGl0ID0gZmFjdG9yKHNhbXBsZV9tZXRhZGF0YSR0cmVhdG1lbnQsIGxldmVscyA9IGMoIkRNU08iLCAiVDNJT1AiLCAiTVBJIiwgIkNQRiIsICJDUEYuVDNJT1AiKSksDQogICAgICAgICNjbHVzdGVyX3Jvd19zbGljZXMgPSBGQUxTRSwNCiAgICAgICAgY2x1c3Rlcl9jb2x1bW5fc2xpY2VzID0gRkFMU0UsDQogICAgICAgIHJvd190aXRsZSA9IE5VTEwsDQogICAgICAgIHJvd19nYXAgPSB1bml0KDAuNSwgIm1tIiksDQogICAgICAgIGNvbHVtbl9nYXAgPSB1bml0KGMocmVwKDEwLDEpLCByZXAoMiwzKSksICJtbSIpLA0KICAgICAgICAjd2lkdGggPSB1bml0KDgsICJjbSIpLCANCiAgICAgICAgI2hlaWdodCA9IHVuaXQoOCwgImNtIiksDQogICAgICAgIGNvbHVtbl9uYW1lc19ncCA9IGdyaWQ6OmdwYXIoZm9udHNpemUgPSA4KSwNCiAgICAgICAgcm93X25hbWVzX2dwID0gZ3JpZDo6Z3Bhcihmb250c2l6ZSA9IDgpLA0KICAgICAgICB0b3BfYW5ub3RhdGlvbiA9IGNvbEFubiwNCiAgICAgICAgI2xlZnRfYW5ub3RhdGlvbiA9IHJvd0FubiwNCiAgICAgICAgc2hvd19oZWF0bWFwX2xlZ2VuZCA9IEYsDQogICAgICAgIGJvcmRlciA9IFRSVUUsDQogICAgICAgIGNsdXN0ZXJpbmdfbWV0aG9kX3Jvd3MgPSAnd2FyZC5EMicNCiAgICAgICAgKQ0KDQoNCmxpYnJhcnkoR2V0b3B0TG9uZykgICMgZm9yIHRoZSBmdW5jdGlvbiBxcSgpDQpncm91cF9ibG9ja19hbm5vID0gZnVuY3Rpb24oZ3JvdXAsIGVtcHR5X2Fubm8sIGdwID0gZ3BhcigpLCANCiAgICBsYWJlbCA9IE5VTEwsIGxhYmVsX2dwID0gZ3BhcigpKSB7DQoNCiAgICBzZWVrVmlld3BvcnQocXEoImFubm90YXRpb25fQHtlbXB0eV9hbm5vfV9Ae21pbihncm91cCl9IikpDQogICAgbG9jMSA9IGRldmljZUxvYyh4ID0gdW5pdCgwLCAibnBjIiksIHkgPSB1bml0KDAsICJucGMiKSkNCiAgICBzZWVrVmlld3BvcnQocXEoImFubm90YXRpb25fQHtlbXB0eV9hbm5vfV9Ae21heChncm91cCl9IikpDQogICAgbG9jMiA9IGRldmljZUxvYyh4ID0gdW5pdCgxLCAibnBjIiksIHkgPSB1bml0KDEsICJucGMiKSkNCg0KICAgIHNlZWtWaWV3cG9ydCgiZ2xvYmFsIikNCiAgICBncmlkLnJlY3QobG9jMSR4LCBsb2MxJHksIHdpZHRoID0gbG9jMiR4IC0gbG9jMSR4LCBoZWlnaHQgPSBsb2MyJHkgLSBsb2MxJHksIA0KICAgICAgICBqdXN0ID0gYygibGVmdCIsICJib3R0b20iKSwgZ3AgPSBncCkNCiAgICBpZighaXMubnVsbChsYWJlbCkpIHsNCiAgICAgICAgZ3JpZC50ZXh0KGxhYmVsLCB4ID0gKGxvYzEkeCArIGxvYzIkeCkqMC41LCB5ID0gKGxvYzEkeSArIGxvYzIkeSkqMC41LCBncCA9IGxhYmVsX2dwKQ0KICAgIH0NCn0NCg0KZ3JvdXBfYmxvY2tfYW5ubygxOjEsICJlbXB0eTEiLCBncCA9IGdwYXIoZmlsbCA9ICJncmF5NzAiKSwgbGFiZWwgPSAiRE1TTyIpDQpncm91cF9ibG9ja19hbm5vKDI6MiwgImVtcHR5MSIsIGdwID0gZ3BhcihmaWxsID0gInBhbGVncmVlbjMiKSwgbGFiZWwgPSAiVDMrSU9QIikNCmdyb3VwX2Jsb2NrX2Fubm8oMzozLCAiZW1wdHkxIiwgZ3AgPSBncGFyKGZpbGwgPSAibGlnaHRjb3JhbCIpLCBsYWJlbCA9ICJNUEkiKQ0KZ3JvdXBfYmxvY2tfYW5ubyg0OjQsICJlbXB0eTEiLCBncCA9IGdwYXIoZmlsbCA9ICJsaWdodHNreWJsdWUiKSwgbGFiZWwgPSAiQ1BGIikNCmdyb3VwX2Jsb2NrX2Fubm8oNTo1LCAiZW1wdHkxIiwgZ3AgPSBncGFyKGZpbGwgPSAib3JjaGlkMiIpLCBsYWJlbCA9ICJDUEYrVDMrSU9QIikNCg0KDQpgYGANCg0KIyMjIyMgU3Rlcm9pZG9nZW5lc2lzDQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KI2xvYWQgdGhlIGNvdW50c19WU1Qgb2JqZWN0DQpsb2FkKCJEOi8vQW9jZWxsYXJpc19DUEZfTVBJX1QzL1NhdmVkX29iamVjdHMvY291bnRzX1ZTVC5yZHMiKQ0KYGBgDQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KI3NlbGVjdCBnZW5lcw0KDQpnZW5lbGlzdCA8LSBjKCIxMTE1ODc4OTkiLCAjQ1lQMTFBMS9QNDUwc2NjIA0KICAgICAgICAgICAgICAiMTExNTc1NDcxIiwgI0ZEWDEvYWRyZW5veGluDQogICAgICAgICAgICAgICIxMTE1NzA1NTgiLCAjRkRYUiBmZXJyZWRveGluIHJlZHVjdGFzZQ0KICAgICAgICAgICAgICAiMTExNTcwNTcwIiwgI0hzZDNiKDI/KQ0KICAgICAgICAgICAgICAiMTExNTYzNjQwIiwgI2N5cDE3YTENCiAgICAgICAgICAgICAgIjExMTU3NTQwMiIsICNwZ3IvTlIzQzMgIHByb2dlc3Rlcm9uZSByZWNlcHRvcg0KICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgI21pbmVyYWxjb3J0aWNvaWRzIGFuZCBnbHVjb2NvcnRpY29pZHM7IGJ1dCBhbHNvIGFuZHJvc3RlbmVkaW9uZQ0KICAgICAgICAgICAgICAjIiIsICNjeXAyMShhMj8pDQogICAgICAgICAgICAgICIxMTE1Njc0NDYiLCAiMTExNTc1OTMyIiwgI2N5cDExYjEvY3lwMTFjDQogICAgICAgICAgICAgICAgI2NvcnRpc29uZQ0KICAgICAgICAgICAgICAiIiwgI2hzZDExYjEgKHdpbGwgYWN0aXZhdGUpDQogICAgICAgICAgICAgICIxMTE1Njc5NTQiLCAjaHNkMTFiMiAod2lsbCBpbmFjdGl2YXRlIHRvIGNvcnRpc29uZSkNCiAgICAgICAgICAgICAgIjExMTU2NTE0MiIsI0dSMS9ucjNjMWEsDQogICAgICAgICAgICAgICIxMTE1NzQ0OTIiLCNHUjIvbnIzYzFiIA0KICAgICAgICAgICAgICAjIiIsICNhbmRyb3N0ZW5lZGlvbmUgcmVjZXB0b3I/DQogICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICNtaW5lcmFsL2NvcnRpY29zdGVyb25lDQogICAgICAgICAgICAgICMiIiwjY3lwMTFiMg0KICAgICAgICAgICAgICAjIiIsICNhbGRvc3Rlcm9uZSBzeW50aGFzZT8NCiAgICAgICAgICAgICAgIjExMTU2MzI1NCIsICNNUi9ucjNjMg0KICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgI3Rlc3Rvc3Rlcm9uZQ0KICAgICAgICAgICAgICAiMTExNTc2NjY4IiwgI2hzZDE3YjMNCiAgICAgICAgICAgICAgIjExMTU3MjczNCIsICNoc2QxN2IxNA0KICAgICAgICAgICAgICAiMTExNTY5ODQzIiwgI3NyZDVhMQ0KICAgICAgICAgICAgICAiIiwgI0hTRDNhL0FLUjFDNCAzzrEtaHlkcm94eXN0ZXJvaWQgZGVoeWRyb2dlbmFzZQ0KICAgICAgICAgICAgICAiMTExNTg3MzYwIiwgI0FSPyB0aGVyZSBzaG91bGQgYmUgdHdvDQogICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICNlc3Ryb2dlbg0KICAgICAgICAgICAgICAiMTExNTY1NzQ2IiwgIjExMTU3NzI2MyIsICNhcm9tYXRhc2UNCiAgICAgICAgICAgICAgIyIiLCAjRXN0cm9nZW4gc3ludGhldGFzZSBDWVAxOUExDQogICAgICAgICAgICAgICIxMTE1NzI3MzQiLCAjSFNEMTdiMTQgzrItSHlkcm94eXN0ZXJvaWQgZGVoeWRyb2dlbmFzZSB0eXBlIDE0DQogICAgICAgICAgICAgICIxMTE1NzEwNDQiLCAgI0VSIGVzcjEgKEVSYSkNCiAgICAgICAgICAgICAgIjExMTU4ODk5OCIsICNFUiBlc3IyYSAoRVJiSUkpDQogICAgICAgICAgICAgICIxMTE1ODY3NzgiLCAjRVIgZXNyMmIgKEVSYkkpDQogICAgICAgICAgICAgICIxMTE1Njc5MjYiICNncGVyDQogICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAjMTExNTc1NDAyDQogICAgICAgICAgICAgIA0KICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgI3N0YXJkNT8NCiAgICAgICAgICAgICAgI2ZkeDI/DQogICAgICAgICAgICAgICNvdGhlcnM/DQogICAgICAgICAgICAgICkNCg0KDQoNCiNhbm5vdGF0aW9uX2luZm9bYW5ub3RhdGlvbl9pbmZvJGVuc2VtYmxfSUQgJWluJSBnZW5lbGlzdCxjKCJlbnNlbWJsX0lEIiwgImVudHJlel9JRCIpXQ0KDQoNCg0Kc2VsZWN0ZWRfZ2VuZXMgPC0gYyhnZW5lbGlzdCkNCg0KDQoNCiN0aGUgc3Vic2V0IGFib3ZlIHdhcyBjaG9zZW4gYmFzZWQgb24gdGhlIGVuc2VtYmxlIGFubm90YXRpb24uIGNvbnZlcnQgdG8gTkNCSQ0KI3NlbGVjdGVkX2dlbmVzIDwtIGFubm90YXRpb25faW5mbyRlbnRyZXpfSURbbWF0Y2goc2VsZWN0ZWRfZ2VuZXMsIGFubm90YXRpb25faW5mbyRlbnNlbWJsX0lEKV0NCg0KDQpgYGANCg0KDQpgYGB7ciwgZWNobz1GQUxTRX0NCmxvYWQoIkQ6Ly9Bb2NlbGxhcmlzX0NQRl9NUElfVDMvU2F2ZWRfb2JqZWN0cy9DUEZfc2lnbmlmaWNhbnRfZ2VuZXMucmRzIikNCg0Kc2VsZWN0ZWRfZ2VuZXMgPC0gc2VsZWN0ZWRfZ2VuZXNbc2VsZWN0ZWRfZ2VuZXMgJWluJSBDUEZfc2lnbmlmaWNhbnRdICNvbmx5IG9uZQ0KYGBgDQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KIyBSZXR1cm5zIHRoZSBtaXNzaW5nIGdlbmVzOg0KbWlzc2luZ19nZW5lcyA8LSBhcy5kYXRhLmZyYW1lKHNldGRpZmYoc2VsZWN0ZWRfZ2VuZXMsIHJvdy5uYW1lcyhjb3VudHNfVlNUKSkpIA0KY29sbmFtZXMobWlzc2luZ19nZW5lcykgPC0gImVudHJlel9JRCINCm1pc3NpbmdfZ2VuZXMkZGVzY3JpcHRpb24gPC0gYW5ub3RhdGlvbl9pbmZvJG1lcmdlZF9kZXNjcmlwdGlvblttYXRjaChtaXNzaW5nX2dlbmVzJGVudHJlel9JRCxhbm5vdGF0aW9uX2luZm8kZW50cmV6X0lEKV0NCiNubyBtaXNzaW5nIGdlbmVzDQoNCiMgUmV0dXJucyB0aGUgZXhpc3RpbmcgZ2VuZXM6DQpzZWxlY3RlZF9nZW5lcyA8LSBhcy5kYXRhLmZyYW1lKGludGVyc2VjdChzZWxlY3RlZF9nZW5lcywgcm93Lm5hbWVzKGNvdW50c19WU1QpKSkNCmNvbG5hbWVzKHNlbGVjdGVkX2dlbmVzKSA8LSAiZW50cmV6X0lEIg0Kc2VsZWN0ZWRfZ2VuZXMkZGVzY3JpcHRpb24gPC0gYW5ub3RhdGlvbl9pbmZvJG1lcmdlZF9kZXNjcmlwdGlvblttYXRjaChzZWxlY3RlZF9nZW5lcyRlbnRyZXpfSUQsYW5ub3RhdGlvbl9pbmZvJGVudHJlel9JRCldDQoNCiNwcmludCBsaXN0IG9mIGRpY2FyZGVkIGdlbmVzIChiZWNhdXNlIG1pc3NpbmcpIGFuZCBvZiByZXRhaW5lZCBnZW5lcyAoY3VyYXRlZCBkaWdlc3Rpb24gZ2VuZXMsIHByZXNlbnQgaW4gdGhlIGRhdGFzZXQpDQoNCiNrYWJsZShtaXNzaW5nX2dlbmVzLCBjYXB0aW9uID0gIkdlbmVzIG1pc3NpbmcgZnJvbSB0aGUgZGF0YXNldCAoaWdub3JlZCkiKQ0Ka2FibGUoc2VsZWN0ZWRfZ2VuZXMsIGNhcHRpb24gPSAiR2VuZXMgcHJlc2VudCBpbiB0aGUgZGF0YXNldCAocmV0YWluZWQpIikNCg0KIyMgc3Vic2V0IHRoZSBvcmlnaW5hbCBWU1Qgb2JqZWN0cyB0byBvbmx5IGtlZXAgc2VsZWN0ZWQgZ2VuZXMNCmNvdW50c19WU1Rfc2VsZWN0ZWRnZW5lcyA8LSBzdWJzZXQoY291bnRzX1ZTVCwgcm93bmFtZXMoY291bnRzX1ZTVCkgJWluJSBzZWxlY3RlZF9nZW5lcyRlbnRyZXpfSUQpDQpyb3duYW1lcyhjb3VudHNfVlNUX3NlbGVjdGVkZ2VuZXMpIDwtIGFubm90YXRpb25faW5mbyRtZXJnZWRfZGVzY3JpcHRpb25bbWF0Y2gocm93bmFtZXMoY291bnRzX1ZTVF9zZWxlY3RlZGdlbmVzKSwgYW5ub3RhdGlvbl9pbmZvJGVudHJlel9JRCldDQoNCiNyZW1vdmUgdW51c2VkIHZhcmlhYmxlcw0KI3JtKHNlbGVjdGVkX2dlbmVzKQ0KDQpgYGANCg0KDQpgYGB7ciwgZmlnLmhlaWdodD00LCBmaWcud2lkdGg9MTAsIGVjaG89RkFMU0V9DQoNCiMjZGVmaW5lIHRoZSBjb2xvcnMgZm9yIHRoZSBoZWF0bWFwIChjYXRlZ29yaWNhbCk6IDEgY29sb3IgZm9yIGVhY2ggc21hbGxlc3QgZXhwZXJpbWVudGFsIHVuaXQgdGhhdCBpcyBiZWluZyAgY29tcGFyZWQ7IGkuZS4gaGVyZSB0aGUgdHJlYXRtZW50DQpjb2xvcl9jYXRlZ29yaWNhbF9oZWF0bWFwIDwtIGNvbG9yX2NhdGVnb3JpY2FsX3RyZWF0bWVudA0KI25hbWUgdGhpcyBsaXN0IG9mIGNvbG9yIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgbmFtZXMgKG5vdGU6IHRoZXNlIGFyZSB0aGUgdW5pcXVlIHZhbHVlcyBmb3IgdGhhdCBjYXRlZ29yeSBpbiB0aGUgc2FtcGxlIG1ldGFkYXRhKQ0KY29sb3JfY2F0ZWdvcmljYWxfaGVhdG1hcF9uYW1lZCA8LSBjb2xvcl9jYXRlZ29yaWNhbF9oZWF0bWFwDQpuYW1lcyhjb2xvcl9jYXRlZ29yaWNhbF9oZWF0bWFwX25hbWVkKSA8LSB1bmlxdWUoc2FtcGxlX21ldGFkYXRhJHRyZWF0bWVudCkNCg0KI2xvYWQgdGhpcyBpbmZvcm1hdGlvbiBpbnRvIHRoZSBoZWF0bWFwDQpjb2xBbm4gPC0gSGVhdG1hcEFubm90YXRpb24oI2RmID0gZGF0YS5mcmFtZSh0cmVhdG1lbnQgPSBzYW1wbGVfbWV0YWRhdGEkdHJlYXRtZW50KSwgI3RoZSBuYW1lIG9mIHRoZSBjb2x1bW4gbmVlZHMgdG8gbWF0Y2ggdGhlIG5hbWUgb2YgdGhlIG5hbWVkIGxpc3QNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjY29sID0gbGlzdCgidHJlYXRtZW50IiA9IGNvbG9yX2NhdGVnb3JpY2FsX2hlYXRtYXBfbmFtZWQpLCAjc2V0IHRoZSBuYW1lIG9mIHRoZSBuYW1lZCBsaXN0IHNvIGl0IG1hdGNoZXMNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjYW5ub3RhdGlvbl93aWR0aCA9IHVuaXQoYygxLCA0KSwgJ2NtJyksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgI2dhcCA9IHVuaXQoMSwgJ21tJykNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG93X2xlZ2VuZCA9IEZBTFNFLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3dfYW5ub3RhdGlvbl9uYW1lID0gRkFMU0UsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2ggPSAnY29sJywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjYWxzbyBjcmVhdGUgYW4gZW1wdHkgcm93IGFib2UgdGhlIGhlYXRtYXAsIHRvIGRpc3BsYXkgYWRkaXRpb25hbCBpbmZvDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1wdHkxID0gYW5ub19lbXB0eShib3JkZXIgPSBGQUxTRSwgaGVpZ2h0PSB1bml0KDgsICJtbSIpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICkNCg0KDQpIZWF0bWFwKG1hdCA9IHQoc2NhbGUodChjb3VudHNfVlNUX3NlbGVjdGVkZ2VuZXNfc29ydGVkKSkpLA0KICAgICAgICBuYW1lPSAiei1zY29yZSIsDQogICAgICAgIGNvbHVtbl90aXRsZSA9IGd0X3JlbmRlcigNCiAgICAgICAgICAiUGF0dGVybiBvZiBleHByZXNzaW9uIChhcyA8c3BhbiBzdHlsZT0nY29sb3I6YnJvd24yJz4qKnotc2NvcmVzKio8L3NwYW4+KSA8YnIvPiBvZiBzdGVyb2lkb2dlbmVzaXMgZ2VuZXMiDQogICAgICAgICAgKSwNCiAgICAgICAgY29sID0gcmV2KGJyZXdlci5wYWwoMTEsIlJkQnUiKSksDQogICAgICAgIG5hX2NvbCA9ICJibGFjayIsDQogICAgICAgIGNsdXN0ZXJfcm93cyA9IFQsDQogICAgICAgIHNob3dfcm93X2RlbmQgPSBULA0KICAgICAgICAjcm93X29yZGVyID0gb3JkZXJlZF9sZXZlbHMsDQogICAgICAgIGNsdXN0ZXJfY29sdW1ucyA9IEZBTFNFLA0KICAgICAgICBzaG93X2NvbHVtbl9kZW5kID0gRkFMU0UsDQogICAgICAgICNjb2x1bW5fb3JkZXIgPSBvcmRlcmVkX2xldmVscywNCiAgICAgICAgI3Jvd19zcGxpdCA9IGZhY3RvcihwYXN0ZTAoc2FtcGxlX21ldGFkYXRhJHNlZ21lbnQsIHNhbXBsZV9tZXRhZGF0YSRzdGFnZSksIGxldmVscyA9IGMoImxpdmVyUzEiLCAibGl2ZXJTNCIsICJsaXZlclM3IiwgInN0b21hY2hTMSIsICJpbnRlc3RpbmVTMSIsICJzdG9tYWNoUzQiLCAiQV9pbnRlc3RpbmVTNCIsICJQX2ludGVzdGluZVM0IiwgInN0b21hY2hTNyIsICJBX2ludGVzdGluZVM3IiwgIlBfaW50ZXN0aW5lUzciKSksDQogICAgICAgIGNvbHVtbl9zcGxpdCA9IGZhY3RvcihzYW1wbGVfbWV0YWRhdGEkdHJlYXRtZW50LCBsZXZlbHMgPSBjKCJETVNPIiwgIlQzSU9QIiwgIk1QSSIsICJDUEYiLCAiQ1BGLlQzSU9QIikpLA0KICAgICAgICAjY2x1c3Rlcl9yb3dfc2xpY2VzID0gRkFMU0UsDQogICAgICAgIGNsdXN0ZXJfY29sdW1uX3NsaWNlcyA9IEZBTFNFLA0KICAgICAgICByb3dfdGl0bGUgPSBOVUxMLA0KICAgICAgICByb3dfZ2FwID0gdW5pdCgwLjUsICJtbSIpLA0KICAgICAgICBjb2x1bW5fZ2FwID0gdW5pdChjKHJlcCgxMCwxKSwgcmVwKDIsMykpLCAibW0iKSwNCiAgICAgICAgI3dpZHRoID0gdW5pdCg4LCAiY20iKSwgDQogICAgICAgICNoZWlnaHQgPSB1bml0KDgsICJjbSIpLA0KICAgICAgICBjb2x1bW5fbmFtZXNfZ3AgPSBncmlkOjpncGFyKGZvbnRzaXplID0gOCksDQogICAgICAgIHJvd19uYW1lc19ncCA9IGdyaWQ6OmdwYXIoZm9udHNpemUgPSA4KSwNCiAgICAgICAgdG9wX2Fubm90YXRpb24gPSBjb2xBbm4sDQogICAgICAgICNsZWZ0X2Fubm90YXRpb24gPSByb3dBbm4sDQogICAgICAgIHNob3dfaGVhdG1hcF9sZWdlbmQgPSBGLA0KICAgICAgICBib3JkZXIgPSBUUlVFLA0KICAgICAgICBjbHVzdGVyaW5nX21ldGhvZF9yb3dzID0gJ3dhcmQuRDInDQogICAgICAgICkNCg0KDQpsaWJyYXJ5KEdldG9wdExvbmcpICAjIGZvciB0aGUgZnVuY3Rpb24gcXEoKQ0KZ3JvdXBfYmxvY2tfYW5ubyA9IGZ1bmN0aW9uKGdyb3VwLCBlbXB0eV9hbm5vLCBncCA9IGdwYXIoKSwgDQogICAgbGFiZWwgPSBOVUxMLCBsYWJlbF9ncCA9IGdwYXIoKSkgew0KDQogICAgc2Vla1ZpZXdwb3J0KHFxKCJhbm5vdGF0aW9uX0B7ZW1wdHlfYW5ub31fQHttaW4oZ3JvdXApfSIpKQ0KICAgIGxvYzEgPSBkZXZpY2VMb2MoeCA9IHVuaXQoMCwgIm5wYyIpLCB5ID0gdW5pdCgwLCAibnBjIikpDQogICAgc2Vla1ZpZXdwb3J0KHFxKCJhbm5vdGF0aW9uX0B7ZW1wdHlfYW5ub31fQHttYXgoZ3JvdXApfSIpKQ0KICAgIGxvYzIgPSBkZXZpY2VMb2MoeCA9IHVuaXQoMSwgIm5wYyIpLCB5ID0gdW5pdCgxLCAibnBjIikpDQoNCiAgICBzZWVrVmlld3BvcnQoImdsb2JhbCIpDQogICAgZ3JpZC5yZWN0KGxvYzEkeCwgbG9jMSR5LCB3aWR0aCA9IGxvYzIkeCAtIGxvYzEkeCwgaGVpZ2h0ID0gbG9jMiR5IC0gbG9jMSR5LCANCiAgICAgICAganVzdCA9IGMoImxlZnQiLCAiYm90dG9tIiksIGdwID0gZ3ApDQogICAgaWYoIWlzLm51bGwobGFiZWwpKSB7DQogICAgICAgIGdyaWQudGV4dChsYWJlbCwgeCA9IChsb2MxJHggKyBsb2MyJHgpKjAuNSwgeSA9IChsb2MxJHkgKyBsb2MyJHkpKjAuNSwgZ3AgPSBsYWJlbF9ncCkNCiAgICB9DQp9DQoNCmdyb3VwX2Jsb2NrX2Fubm8oMToxLCAiZW1wdHkxIiwgZ3AgPSBncGFyKGZpbGwgPSAiZ3JheTcwIiksIGxhYmVsID0gIkRNU08iKQ0KZ3JvdXBfYmxvY2tfYW5ubygyOjIsICJlbXB0eTEiLCBncCA9IGdwYXIoZmlsbCA9ICJwYWxlZ3JlZW4zIiksIGxhYmVsID0gIlQzK0lPUCIpDQpncm91cF9ibG9ja19hbm5vKDM6MywgImVtcHR5MSIsIGdwID0gZ3BhcihmaWxsID0gImxpZ2h0Y29yYWwiKSwgbGFiZWwgPSAiTVBJIikNCmdyb3VwX2Jsb2NrX2Fubm8oNDo0LCAiZW1wdHkxIiwgZ3AgPSBncGFyKGZpbGwgPSAibGlnaHRza3libHVlIiksIGxhYmVsID0gIkNQRiIpDQpncm91cF9ibG9ja19hbm5vKDU6NSwgImVtcHR5MSIsIGdwID0gZ3BhcihmaWxsID0gIm9yY2hpZDIiKSwgbGFiZWwgPSAiQ1BGK1QzK0lPUCIpDQoNCg0KYGBgDQoNCiMjIyMjIEJpbGUgYWNpZHMNCg0KYGBge3IsIGVjaG89RkFMU0V9DQojbG9hZCB0aGUgY291bnRzX1ZTVCBvYmplY3QNCmxvYWQoIkQ6Ly9Bb2NlbGxhcmlzX0NQRl9NUElfVDMvU2F2ZWRfb2JqZWN0cy9jb3VudHNfVlNULnJkcyIpDQpgYGANCg0KYGBge3IsIGVjaG89RkFMU0V9DQojc2VsZWN0IGdlbmVzDQoNCmdlbmVsaXN0IDwtIGMoIjExMTU2NDk2NSIsICNBQkMgdHJhbnNwb3J0ZXIgRzUgKGNlbGx1bGFyIGV4cG9ydCkNCiAgICAgICAgICAgICAgIjExMTU2NDk2NCIsICNBQkMgdHJhbnNwb3J0ZXIgRzggKGNlbGx1bGFyIGV4cG9ydCkNCiAgICAgICAgICAgICAgIjExMTU3NTA0MiIsICNzdGFyIChtaXRvIGltcG9ydCkNCiAgICAgICAgICAgICAgIjExMTU3Njk4NSIsICNjeXA3YTENCiAgICAgICAgICAgICAgIjExMTU2NDQ4NiIsICNjeXA3YjEgKGFsdGVybmF0aXZlKQ0KICAgICAgICAgICAgICAiMTExNTg4OTAwIiwgI2hzZDNiNw0KICAgICAgICAgICAgICAiMTExNTY4NjQ5IiwgIjExMTU2ODY1NCIsICNDWVA4QjEgKGNob2xpYyBhY2lkIHNodW50KQ0KICAgICAgICAgICAgICAiMTExNTczMTY3IiwgI0FLUjFEMS9TUkQ1QjENCiAgICAgICAgICAgICAgIyJYIiwgI0FLUjFDNA0KICAgICAgICAgICAgICAiMTExNTY4NTMyIiwgIjExMTU3NDQ1NyIsICNDWVAyN0ExIChhbHNvIGludm9sdmVkIGluIGFsdGVybmF0aXZlIHBhdGgsIGFuZCBDQSBzaHVudCkNCiAgICAgICAgICAgICAgIjExMTU2Mzg4MiIsICIxMTE1Nzc3MTUiLCAjU0xDMjdBNQ0KICAgICAgICAgICAgICAiMTExNTY0ODQ2IiwgI0FNQUNSDQogICAgICAgICAgICAgICIxMTE1NjQyMDciLCAiMTExNTY0MTgwIiwgI0FDT1gyIChjb3VsZCBub3QgZmluZCkNCiAgICAgICAgICAgICAgIjExMTU2NDY4NSIsICNIU0QxN0I0DQogICAgICAgICAgICAgICIxMTE1ODc2MTgiLCAiMTExNTc2MTUwIiwgI1Blcm94aXNvbWFsIHRoaW9sYXNlIChTQ1AyKQ0KICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgI2Nvbmp1Z2F0aW9uDQogICAgICAgICAgICAgICIxMTE1Njk1NjYiLCAjQkFBVCAoY291bGQgbm90IGZpbmQpDQogICAgICAgICAgICAgICNleGNyZXRpb24NCiAgICAgICAgICAgICAgIjExMTU3MjgyNCIsICIxMTE1NjQxNjgiLCAjQUJDMTEvQlNFUCBBVFAtYmluZGluZyBjYXNzZXR0ZSwgc3ViLWZhbWlseSBCIG1lbWJlciAxMSAoY291bGQgbm90IGZpbmQpLiBOb3RlIHRoYXQgb25seSBhY2JjMWIgaXMgbGl2ZXIgKGkuZS4gYmlsZSBzZWNyZXRpb24pLCBBYmNiMTFhIGlzIGludGVzdGluYWwNCiAgICAgICAgICAgICAgIjExMTU2NTY3MCIgI0FUUDhCMT8NCiAgICAgICAgICAgICAgKQ0KDQoNCg0KI2Fubm90YXRpb25faW5mb1thbm5vdGF0aW9uX2luZm8kZW5zZW1ibF9JRCAlaW4lIGdlbmVsaXN0LGMoImVuc2VtYmxfSUQiLCAiZW50cmV6X0lEIildDQoNCg0KDQpzZWxlY3RlZF9nZW5lcyA8LSBjKGdlbmVsaXN0KQ0KDQoNCg0KI3RoZSBzdWJzZXQgYWJvdmUgd2FzIGNob3NlbiBiYXNlZCBvbiB0aGUgZW5zZW1ibGUgYW5ub3RhdGlvbi4gY29udmVydCB0byBOQ0JJDQojc2VsZWN0ZWRfZ2VuZXMgPC0gYW5ub3RhdGlvbl9pbmZvJGVudHJlel9JRFttYXRjaChzZWxlY3RlZF9nZW5lcywgYW5ub3RhdGlvbl9pbmZvJGVuc2VtYmxfSUQpXQ0KDQoNCmBgYA0KDQpgYGB7ciwgZWNobz1GQUxTRX0NCmxvYWQoIkQ6Ly9Bb2NlbGxhcmlzX0NQRl9NUElfVDMvU2F2ZWRfb2JqZWN0cy9DUEZfc2lnbmlmaWNhbnRfZ2VuZXMucmRzIikNCg0Kc2VsZWN0ZWRfZ2VuZXMgPC0gc2VsZWN0ZWRfZ2VuZXNbc2VsZWN0ZWRfZ2VuZXMgJWluJSBDUEZfc2lnbmlmaWNhbnRdICNvbmx5IG9uZQ0KYGBgDQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KIyBSZXR1cm5zIHRoZSBtaXNzaW5nIGdlbmVzOg0KbWlzc2luZ19nZW5lcyA8LSBhcy5kYXRhLmZyYW1lKHNldGRpZmYoc2VsZWN0ZWRfZ2VuZXMsIHJvdy5uYW1lcyhjb3VudHNfVlNUKSkpIA0KY29sbmFtZXMobWlzc2luZ19nZW5lcykgPC0gImVudHJlel9JRCINCm1pc3NpbmdfZ2VuZXMkZGVzY3JpcHRpb24gPC0gYW5ub3RhdGlvbl9pbmZvJG1lcmdlZF9kZXNjcmlwdGlvblttYXRjaChtaXNzaW5nX2dlbmVzJGVudHJlel9JRCxhbm5vdGF0aW9uX2luZm8kZW50cmV6X0lEKV0NCiNubyBtaXNzaW5nIGdlbmVzDQoNCiMgUmV0dXJucyB0aGUgZXhpc3RpbmcgZ2VuZXM6DQpzZWxlY3RlZF9nZW5lcyA8LSBhcy5kYXRhLmZyYW1lKGludGVyc2VjdChzZWxlY3RlZF9nZW5lcywgcm93Lm5hbWVzKGNvdW50c19WU1QpKSkNCmNvbG5hbWVzKHNlbGVjdGVkX2dlbmVzKSA8LSAiZW50cmV6X0lEIg0Kc2VsZWN0ZWRfZ2VuZXMkZGVzY3JpcHRpb24gPC0gYW5ub3RhdGlvbl9pbmZvJG1lcmdlZF9kZXNjcmlwdGlvblttYXRjaChzZWxlY3RlZF9nZW5lcyRlbnRyZXpfSUQsYW5ub3RhdGlvbl9pbmZvJGVudHJlel9JRCldDQoNCiNwcmludCBsaXN0IG9mIGRpY2FyZGVkIGdlbmVzIChiZWNhdXNlIG1pc3NpbmcpIGFuZCBvZiByZXRhaW5lZCBnZW5lcyAoY3VyYXRlZCBkaWdlc3Rpb24gZ2VuZXMsIHByZXNlbnQgaW4gdGhlIGRhdGFzZXQpDQoNCiNrYWJsZShtaXNzaW5nX2dlbmVzLCBjYXB0aW9uID0gIkdlbmVzIG1pc3NpbmcgZnJvbSB0aGUgZGF0YXNldCAoaWdub3JlZCkiKQ0Ka2FibGUoc2VsZWN0ZWRfZ2VuZXMsIGNhcHRpb24gPSAiR2VuZXMgcHJlc2VudCBpbiB0aGUgZGF0YXNldCAocmV0YWluZWQpIikNCg0KIyMgc3Vic2V0IHRoZSBvcmlnaW5hbCBWU1Qgb2JqZWN0cyB0byBvbmx5IGtlZXAgc2VsZWN0ZWQgZ2VuZXMNCmNvdW50c19WU1Rfc2VsZWN0ZWRnZW5lcyA8LSBzdWJzZXQoY291bnRzX1ZTVCwgcm93bmFtZXMoY291bnRzX1ZTVCkgJWluJSBzZWxlY3RlZF9nZW5lcyRlbnRyZXpfSUQpDQpyb3duYW1lcyhjb3VudHNfVlNUX3NlbGVjdGVkZ2VuZXMpIDwtIGFubm90YXRpb25faW5mbyRtZXJnZWRfZGVzY3JpcHRpb25bbWF0Y2gocm93bmFtZXMoY291bnRzX1ZTVF9zZWxlY3RlZGdlbmVzKSwgYW5ub3RhdGlvbl9pbmZvJGVudHJlel9JRCldDQoNCiNyZW1vdmUgdW51c2VkIHZhcmlhYmxlcw0KI3JtKHNlbGVjdGVkX2dlbmVzKQ0KDQpgYGANCg0KDQpgYGB7ciwgZmlnLmhlaWdodD00LCBmaWcud2lkdGg9MTAsIGVjaG89RkFMU0V9DQoNCiMjZGVmaW5lIHRoZSBjb2xvcnMgZm9yIHRoZSBoZWF0bWFwIChjYXRlZ29yaWNhbCk6IDEgY29sb3IgZm9yIGVhY2ggc21hbGxlc3QgZXhwZXJpbWVudGFsIHVuaXQgdGhhdCBpcyBiZWluZyAgY29tcGFyZWQ7IGkuZS4gaGVyZSB0aGUgdHJlYXRtZW50DQpjb2xvcl9jYXRlZ29yaWNhbF9oZWF0bWFwIDwtIGNvbG9yX2NhdGVnb3JpY2FsX3RyZWF0bWVudA0KI25hbWUgdGhpcyBsaXN0IG9mIGNvbG9yIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgbmFtZXMgKG5vdGU6IHRoZXNlIGFyZSB0aGUgdW5pcXVlIHZhbHVlcyBmb3IgdGhhdCBjYXRlZ29yeSBpbiB0aGUgc2FtcGxlIG1ldGFkYXRhKQ0KY29sb3JfY2F0ZWdvcmljYWxfaGVhdG1hcF9uYW1lZCA8LSBjb2xvcl9jYXRlZ29yaWNhbF9oZWF0bWFwDQpuYW1lcyhjb2xvcl9jYXRlZ29yaWNhbF9oZWF0bWFwX25hbWVkKSA8LSB1bmlxdWUoc2FtcGxlX21ldGFkYXRhJHRyZWF0bWVudCkNCg0KI2xvYWQgdGhpcyBpbmZvcm1hdGlvbiBpbnRvIHRoZSBoZWF0bWFwDQpjb2xBbm4gPC0gSGVhdG1hcEFubm90YXRpb24oI2RmID0gZGF0YS5mcmFtZSh0cmVhdG1lbnQgPSBzYW1wbGVfbWV0YWRhdGEkdHJlYXRtZW50KSwgI3RoZSBuYW1lIG9mIHRoZSBjb2x1bW4gbmVlZHMgdG8gbWF0Y2ggdGhlIG5hbWUgb2YgdGhlIG5hbWVkIGxpc3QNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjY29sID0gbGlzdCgidHJlYXRtZW50IiA9IGNvbG9yX2NhdGVnb3JpY2FsX2hlYXRtYXBfbmFtZWQpLCAjc2V0IHRoZSBuYW1lIG9mIHRoZSBuYW1lZCBsaXN0IHNvIGl0IG1hdGNoZXMNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjYW5ub3RhdGlvbl93aWR0aCA9IHVuaXQoYygxLCA0KSwgJ2NtJyksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgI2dhcCA9IHVuaXQoMSwgJ21tJykNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG93X2xlZ2VuZCA9IEZBTFNFLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3dfYW5ub3RhdGlvbl9uYW1lID0gRkFMU0UsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2ggPSAnY29sJywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjYWxzbyBjcmVhdGUgYW4gZW1wdHkgcm93IGFib2UgdGhlIGhlYXRtYXAsIHRvIGRpc3BsYXkgYWRkaXRpb25hbCBpbmZvDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1wdHkxID0gYW5ub19lbXB0eShib3JkZXIgPSBGQUxTRSwgaGVpZ2h0PSB1bml0KDgsICJtbSIpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICkNCg0KDQpIZWF0bWFwKG1hdCA9IHQoc2NhbGUodChjb3VudHNfVlNUX3NlbGVjdGVkZ2VuZXNfc29ydGVkKSkpLA0KICAgICAgICBuYW1lPSAiei1zY29yZSIsDQogICAgICAgIGNvbHVtbl90aXRsZSA9IGd0X3JlbmRlcigNCiAgICAgICAgICAiUGF0dGVybiBvZiBleHByZXNzaW9uIChhcyA8c3BhbiBzdHlsZT0nY29sb3I6YnJvd24yJz4qKnotc2NvcmVzKio8L3NwYW4+KSA8YnIvPiBvZiBiaWxlIGFjaWRzIGdlbmVzIg0KICAgICAgICAgICksDQogICAgICAgIGNvbCA9IHJldihicmV3ZXIucGFsKDExLCJSZEJ1IikpLA0KICAgICAgICBuYV9jb2wgPSAiYmxhY2siLA0KICAgICAgICBjbHVzdGVyX3Jvd3MgPSBULA0KICAgICAgICBzaG93X3Jvd19kZW5kID0gVCwNCiAgICAgICAgI3Jvd19vcmRlciA9IG9yZGVyZWRfbGV2ZWxzLA0KICAgICAgICBjbHVzdGVyX2NvbHVtbnMgPSBGQUxTRSwNCiAgICAgICAgc2hvd19jb2x1bW5fZGVuZCA9IEZBTFNFLA0KICAgICAgICAjY29sdW1uX29yZGVyID0gb3JkZXJlZF9sZXZlbHMsDQogICAgICAgICNyb3dfc3BsaXQgPSBmYWN0b3IocGFzdGUwKHNhbXBsZV9tZXRhZGF0YSRzZWdtZW50LCBzYW1wbGVfbWV0YWRhdGEkc3RhZ2UpLCBsZXZlbHMgPSBjKCJsaXZlclMxIiwgImxpdmVyUzQiLCAibGl2ZXJTNyIsICJzdG9tYWNoUzEiLCAiaW50ZXN0aW5lUzEiLCAic3RvbWFjaFM0IiwgIkFfaW50ZXN0aW5lUzQiLCAiUF9pbnRlc3RpbmVTNCIsICJzdG9tYWNoUzciLCAiQV9pbnRlc3RpbmVTNyIsICJQX2ludGVzdGluZVM3IikpLA0KICAgICAgICBjb2x1bW5fc3BsaXQgPSBmYWN0b3Ioc2FtcGxlX21ldGFkYXRhJHRyZWF0bWVudCwgbGV2ZWxzID0gYygiRE1TTyIsICJUM0lPUCIsICJNUEkiLCAiQ1BGIiwgIkNQRi5UM0lPUCIpKSwNCiAgICAgICAgI2NsdXN0ZXJfcm93X3NsaWNlcyA9IEZBTFNFLA0KICAgICAgICBjbHVzdGVyX2NvbHVtbl9zbGljZXMgPSBGQUxTRSwNCiAgICAgICAgcm93X3RpdGxlID0gTlVMTCwNCiAgICAgICAgcm93X2dhcCA9IHVuaXQoMC41LCAibW0iKSwNCiAgICAgICAgY29sdW1uX2dhcCA9IHVuaXQoYyhyZXAoMTAsMSksIHJlcCgyLDMpKSwgIm1tIiksDQogICAgICAgICN3aWR0aCA9IHVuaXQoOCwgImNtIiksIA0KICAgICAgICAjaGVpZ2h0ID0gdW5pdCg4LCAiY20iKSwNCiAgICAgICAgY29sdW1uX25hbWVzX2dwID0gZ3JpZDo6Z3Bhcihmb250c2l6ZSA9IDgpLA0KICAgICAgICByb3dfbmFtZXNfZ3AgPSBncmlkOjpncGFyKGZvbnRzaXplID0gOCksDQogICAgICAgIHRvcF9hbm5vdGF0aW9uID0gY29sQW5uLA0KICAgICAgICAjbGVmdF9hbm5vdGF0aW9uID0gcm93QW5uLA0KICAgICAgICBzaG93X2hlYXRtYXBfbGVnZW5kID0gRiwNCiAgICAgICAgYm9yZGVyID0gVFJVRSwNCiAgICAgICAgY2x1c3RlcmluZ19tZXRob2Rfcm93cyA9ICd3YXJkLkQyJw0KICAgICAgICApDQoNCg0KbGlicmFyeShHZXRvcHRMb25nKSAgIyBmb3IgdGhlIGZ1bmN0aW9uIHFxKCkNCmdyb3VwX2Jsb2NrX2Fubm8gPSBmdW5jdGlvbihncm91cCwgZW1wdHlfYW5ubywgZ3AgPSBncGFyKCksIA0KICAgIGxhYmVsID0gTlVMTCwgbGFiZWxfZ3AgPSBncGFyKCkpIHsNCg0KICAgIHNlZWtWaWV3cG9ydChxcSgiYW5ub3RhdGlvbl9Ae2VtcHR5X2Fubm99X0B7bWluKGdyb3VwKX0iKSkNCiAgICBsb2MxID0gZGV2aWNlTG9jKHggPSB1bml0KDAsICJucGMiKSwgeSA9IHVuaXQoMCwgIm5wYyIpKQ0KICAgIHNlZWtWaWV3cG9ydChxcSgiYW5ub3RhdGlvbl9Ae2VtcHR5X2Fubm99X0B7bWF4KGdyb3VwKX0iKSkNCiAgICBsb2MyID0gZGV2aWNlTG9jKHggPSB1bml0KDEsICJucGMiKSwgeSA9IHVuaXQoMSwgIm5wYyIpKQ0KDQogICAgc2Vla1ZpZXdwb3J0KCJnbG9iYWwiKQ0KICAgIGdyaWQucmVjdChsb2MxJHgsIGxvYzEkeSwgd2lkdGggPSBsb2MyJHggLSBsb2MxJHgsIGhlaWdodCA9IGxvYzIkeSAtIGxvYzEkeSwgDQogICAgICAgIGp1c3QgPSBjKCJsZWZ0IiwgImJvdHRvbSIpLCBncCA9IGdwKQ0KICAgIGlmKCFpcy5udWxsKGxhYmVsKSkgew0KICAgICAgICBncmlkLnRleHQobGFiZWwsIHggPSAobG9jMSR4ICsgbG9jMiR4KSowLjUsIHkgPSAobG9jMSR5ICsgbG9jMiR5KSowLjUsIGdwID0gbGFiZWxfZ3ApDQogICAgfQ0KfQ0KDQpncm91cF9ibG9ja19hbm5vKDE6MSwgImVtcHR5MSIsIGdwID0gZ3BhcihmaWxsID0gImdyYXk3MCIpLCBsYWJlbCA9ICJETVNPIikNCmdyb3VwX2Jsb2NrX2Fubm8oMjoyLCAiZW1wdHkxIiwgZ3AgPSBncGFyKGZpbGwgPSAicGFsZWdyZWVuMyIpLCBsYWJlbCA9ICJUMytJT1AiKQ0KZ3JvdXBfYmxvY2tfYW5ubygzOjMsICJlbXB0eTEiLCBncCA9IGdwYXIoZmlsbCA9ICJsaWdodGNvcmFsIiksIGxhYmVsID0gIk1QSSIpDQpncm91cF9ibG9ja19hbm5vKDQ6NCwgImVtcHR5MSIsIGdwID0gZ3BhcihmaWxsID0gImxpZ2h0c2t5Ymx1ZSIpLCBsYWJlbCA9ICJDUEYiKQ0KZ3JvdXBfYmxvY2tfYW5ubyg1OjUsICJlbXB0eTEiLCBncCA9IGdwYXIoZmlsbCA9ICJvcmNoaWQyIiksIGxhYmVsID0gIkNQRitUMytJT1AiKQ0KDQoNCmBgYA0KIyMjIyMgQ2hvbGVzdGVyb2wgcmVndWxhdGlvbiBhbmQgdHJhbnNwb3J0DQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KI2xvYWQgdGhlIGNvdW50c19WU1Qgb2JqZWN0DQpsb2FkKCJEOi8vQW9jZWxsYXJpc19DUEZfTVBJX1QzL1NhdmVkX29iamVjdHMvY291bnRzX1ZTVC5yZHMiKQ0KYGBgDQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KI2h0dHBzOi8vd3d3Lm5jYmkubmxtLm5paC5nb3YvYm9va3MvTkJLMzA1ODk2Lw0KDQojc2VsZWN0IGdlbmVzDQoNCmdlbmVsaXN0IDwtIGMoIjExMTU4MDEzMyIsICIxMTE1Njc5MjciLCAjdXBzdHJlYW0gY2hvbGVzaW4gcmVndWxhdGlvbg0KICAgICAgICAgICAgICAiMTExNTc4MTg5IiwgIjExMTU4MzgzMyIsICNTUkVCUC4uLnNyZWJmMS8yDQogICAgICAgICAgICAgICIxMTE1NzI4NjgiLCAjc2NhcA0KICAgICAgICAgICAgICAiMTExNTcyNTY4IiwgIjExMTU4MTQyMyIsICIxMTE1ODgyMjkiLCNzcHJpbmcxL2VybGluDQogICAgICAgICAgICAgICIxMTE1NzEwMzEiLCAjTFhSL25yMWgzDQogICAgICAgICAgICAgICNyZXZlcnNlIGNob2xlc3Rlcm9sIHRyYW5zcG9ydC8gSERMDQogICAgICAgICAgICAgICNyZW1vdmFsIG9mIGV4Y2VzcyB0aXNzdWUgY2hvbGVzdGVyb2wsIGFuZCBicmluZyBiYWNrIHRvIGxpdmVyIGZvciByZWRpc3RyaWJ1dGlvbiwgb3IgYmlsZSBleHB1bHNpb24NCiAgICAgICAgICAgICAgIjExMTU3OTEwNCIsIjExMTU3NTA1OSIsIjExMTU2NDk0OSIsDQogICAgICAgICAgICAgICIxMTE1NzQ1NDciLCAjQXBvYTFhL2IgI2Fwb2ExYSBsb3N0Pw0KICAgICAgICAgICAgICAiMTE4NDY5NTkwIiwgI0Fwb2EyDQogICAgICAgICAgICAgICIxMTE1NjI2MDMiLCAiMTExNTYyNjA2IiwgIjExMTU4ODUyOCIsI0Fwb2E0YS9iDQogICAgICAgICAgICAgICIxMTE1NzkxMDQiLCAiMTExNTc1MDU5IiwjYWZwNA0KICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgIjExMTU3NTAwMiIsICIxMTE1NzA5MzEiLCIxMTE1NjU2OTEiLCAjYWJjYTFhL2INCiAgICAgICAgICAgICAgIjExMTU3NDQyNyIsICAjc2NhcmIxLCANCiAgICAgICAgICAgICAgIjExMTU4MDM5NSIsIjExMTU3NTY0MCIsICIxMTE1ODMwMzEiLCMoc2NhcmIyYSwgc2NhcmIyYiwgc2NhcmIyYykNCiAgICAgICAgICAgICAgIjExMTU3MjY4OCIsICNucGMyDQogICAgICAgICAgICAgICIxMTE1ODg2OTEiLCAjYWJjZw0KICAgICAgICAgICAgICAiMTExNTgwOTg4IiwgIjExMTU3MTM3NiIsICNsY2F0DQogICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAjZGVsaXZlcnkgYmFjayB0byB0aGUgbGl2ZXINCiAgICAgICAgICAgICAgI2RpcmVjdCwgdGhlIHdob2xlIEhETCBpcyB0YWtlbiB1cA0KICAgICAgICAgICAgICAgICNMREwgcmVjZXB0b3INCiAgICAgICAgICAgICAgIjExMTU3ODQxMyIsICNoZXBhdGljIGxpcGFzZXMNCiAgICAgICAgICAgICAgICAjQXBvRQ0KICAgICAgICAgICAgICAiMTExNTY4MDA5IiwgIjExMTU3NTExNyIsICIxMTE1ODczNjkiLCAiMTExNTY0NDc3IiwgIjExMTU4NjUyOSIsIyBMUlAgYW5kIHN5bmRlY2FuLTQgDQogICAgICAgICAgICAgICNkaXJlY3QsIEhETCBkaXJlY3RseSBiaW5kcyBzY2FyYjEgYW5kIGNob2xlc3Rlcm9sIGlzIHRha2VuDQogICAgICAgICAgICAgICNpbmRpcmVjdCwgdHJhbnNmZXIgdG8gTERML0Fwb2IxMDANCiAgICAgICAgICAgICAgIjExMTU2OTAwNCIsI0NFVFANCiAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICNkaXN0cmlidXRpb24gZnJvbSB0aGUgbGl2ZXIvTERMIChlbmRvZ2Vub3VzIGxpcG9wcm90ZWluIHBhdGh3YXkpDQogICAgICAgICAgICAgICN3aWxsIGJlIGV0c2VyaWZpZWQgd2hlbiBpdCdzIGRpc3RyaWJ1dGVkDQogICAgICAgICAgICAgICIxMTE1ODM2MDciLCAiMTExNTc0MjIyIiwjQUNBVA0KICAgICAgICAgICAgICAiMTExNTYzODk5IiwgIjExMTU4Mzc4NSIsI1NPQVQNCiAgICAgICAgICAgICAgIjExMTU3NTMxOSIsICNNVFRQL1BESUENCiAgICAgICAgICAgICAgIjExMTU4NjI5OSIsIjExMTU2NjQzMiIsICNBcG9iYS9iDQogICAgICAgICAgICAgICMiIiwgI0Fwb0IxMDANCiAgICAgICAgICAgICAgIjExMTU4ODUyOSIsICNBcG9DMS8yLzQgKHNlY29uZGFyeSBjb21wb25lbnRzOyAxLzQgbG9zdD8pDQogICAgICAgICAgICAgICIxMTE1NjI2MDUiLCIxMTE1ODg1MjYiLCAjQXBvRSAoc2Vjb25kYXJ5IGNvbXBvbmVudHMpDQogICAgICAgICAgICAgIA0KICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgI3JlY2VpdmFsIG9mIGNob2xlc3Rlcm9sIChsaXZlciBMREwpDQogICAgICAgICAgICAgICIxMTE1NjYzODciLCAiMTExNTcwMTU3IiwjTERMUmEvYg0KICAgICAgICAgICAgICAiMTExNTgxMzA5IiwgIyh2TERMcikNCiAgICAgICAgICAgICAgIjExMTU2NzU3NyIsICNJRE9MIG15bGlwYS9iDQogICAgICAgICAgICAgICIxMTE1ODExMjciLCAjcGNzazkNCiAgICAgICAgICAgICAgIjExMTU3MzYwMyIsICNOUEMxIA0KICAgICAgICAgICAgICAiMTExNTcyODI0IiwgIjExMTU2NDE2OCIsICNBQkMxMS9CU0VQIEFUUC1iaW5kaW5nIGNhc3NldHRlLCBzdWItZmFtaWx5IEIgbWVtYmVyIDExIChjb3VsZCBub3QgZmluZCkuIE5vdGUgdGhhdCBvbmx5IGFjYmMxYiBpcyBsaXZlciAoaS5lLiBiaWxlIHNlY3JldGlvbiksIEFiY2IxMWEgaXMgaW50ZXN0aW5hbA0KICAgICAgICAgICAgICAiMTExNTY1NjcwIiwgI0FUUDhCMT8NCiAgICAgICAgICAgICAgIjExMTU4NTA4NCIsICIxMTE1ODY1NjgiLCAiMTExNTg2NTY1IiwgIjExMTU2NzgyMSIsICNkZS1lc3RlcmlmaWNhdGlvbjogTElQQSwgTFBMDQogICAgICAgICAgICAgICIxMTE1NzE2MjAiLCAiMTExNTcxOTQ2IiwgDQogICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAjc2VjcmV0aW9uIHRvIGJpbGUNCiAgICAgICAgICAgICAgI2VpdGhlciBkaXJlY3QNCiAgICAgICAgICAgICAgIjExMTU2NDk2NSIsICIxMTE1NjQ5NjQiIyBBQkNHNSBhbmQgQUJDRzggDQogICAgICAgICAgICAgI29yIGJpbGUgcGF0aHdheQ0KICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgKQ0KDQoNCg0KI2Fubm90YXRpb25faW5mb1thbm5vdGF0aW9uX2luZm8kZW5zZW1ibF9JRCAlaW4lIGdlbmVsaXN0LGMoImVuc2VtYmxfSUQiLCAiZW50cmV6X0lEIildDQoNCg0KDQpzZWxlY3RlZF9nZW5lcyA8LSBjKGdlbmVsaXN0KQ0KDQoNCg0KI3RoZSBzdWJzZXQgYWJvdmUgd2FzIGNob3NlbiBiYXNlZCBvbiB0aGUgZW5zZW1ibGUgYW5ub3RhdGlvbi4gY29udmVydCB0byBOQ0JJDQojc2VsZWN0ZWRfZ2VuZXMgPC0gYW5ub3RhdGlvbl9pbmZvJGVudHJlel9JRFttYXRjaChzZWxlY3RlZF9nZW5lcywgYW5ub3RhdGlvbl9pbmZvJGVuc2VtYmxfSUQpXQ0KDQoNCmBgYA0KDQpgYGB7ciwgZWNobz1GQUxTRX0NCmxvYWQoIkQ6Ly9Bb2NlbGxhcmlzX0NQRl9NUElfVDMvU2F2ZWRfb2JqZWN0cy9DUEZfc2lnbmlmaWNhbnRfZ2VuZXMucmRzIikNCg0Kc2VsZWN0ZWRfZ2VuZXMgPC0gc2VsZWN0ZWRfZ2VuZXNbc2VsZWN0ZWRfZ2VuZXMgJWluJSBDUEZfc2lnbmlmaWNhbnRdICNvbmx5IG9uZQ0KYGBgDQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KIyBSZXR1cm5zIHRoZSBtaXNzaW5nIGdlbmVzOg0KbWlzc2luZ19nZW5lcyA8LSBhcy5kYXRhLmZyYW1lKHNldGRpZmYoc2VsZWN0ZWRfZ2VuZXMsIHJvdy5uYW1lcyhjb3VudHNfVlNUKSkpIA0KY29sbmFtZXMobWlzc2luZ19nZW5lcykgPC0gImVudHJlel9JRCINCm1pc3NpbmdfZ2VuZXMkZGVzY3JpcHRpb24gPC0gYW5ub3RhdGlvbl9pbmZvJG1lcmdlZF9kZXNjcmlwdGlvblttYXRjaChtaXNzaW5nX2dlbmVzJGVudHJlel9JRCxhbm5vdGF0aW9uX2luZm8kZW50cmV6X0lEKV0NCiNubyBtaXNzaW5nIGdlbmVzDQoNCiMgUmV0dXJucyB0aGUgZXhpc3RpbmcgZ2VuZXM6DQpzZWxlY3RlZF9nZW5lcyA8LSBhcy5kYXRhLmZyYW1lKGludGVyc2VjdChzZWxlY3RlZF9nZW5lcywgcm93Lm5hbWVzKGNvdW50c19WU1QpKSkNCmNvbG5hbWVzKHNlbGVjdGVkX2dlbmVzKSA8LSAiZW50cmV6X0lEIg0Kc2VsZWN0ZWRfZ2VuZXMkZGVzY3JpcHRpb24gPC0gYW5ub3RhdGlvbl9pbmZvJG1lcmdlZF9kZXNjcmlwdGlvblttYXRjaChzZWxlY3RlZF9nZW5lcyRlbnRyZXpfSUQsYW5ub3RhdGlvbl9pbmZvJGVudHJlel9JRCldDQoNCiNwcmludCBsaXN0IG9mIGRpY2FyZGVkIGdlbmVzIChiZWNhdXNlIG1pc3NpbmcpIGFuZCBvZiByZXRhaW5lZCBnZW5lcyAoY3VyYXRlZCBkaWdlc3Rpb24gZ2VuZXMsIHByZXNlbnQgaW4gdGhlIGRhdGFzZXQpDQoNCiNrYWJsZShtaXNzaW5nX2dlbmVzLCBjYXB0aW9uID0gIkdlbmVzIG1pc3NpbmcgZnJvbSB0aGUgZGF0YXNldCAoaWdub3JlZCkiKQ0Ka2FibGUoc2VsZWN0ZWRfZ2VuZXMsIGNhcHRpb24gPSAiR2VuZXMgcHJlc2VudCBpbiB0aGUgZGF0YXNldCAocmV0YWluZWQpIikNCg0KIyMgc3Vic2V0IHRoZSBvcmlnaW5hbCBWU1Qgb2JqZWN0cyB0byBvbmx5IGtlZXAgc2VsZWN0ZWQgZ2VuZXMNCmNvdW50c19WU1Rfc2VsZWN0ZWRnZW5lcyA8LSBzdWJzZXQoY291bnRzX1ZTVCwgcm93bmFtZXMoY291bnRzX1ZTVCkgJWluJSBzZWxlY3RlZF9nZW5lcyRlbnRyZXpfSUQpDQpyb3duYW1lcyhjb3VudHNfVlNUX3NlbGVjdGVkZ2VuZXMpIDwtIGFubm90YXRpb25faW5mbyRtZXJnZWRfZGVzY3JpcHRpb25bbWF0Y2gocm93bmFtZXMoY291bnRzX1ZTVF9zZWxlY3RlZGdlbmVzKSwgYW5ub3RhdGlvbl9pbmZvJGVudHJlel9JRCldDQoNCiNyZW1vdmUgdW51c2VkIHZhcmlhYmxlcw0KI3JtKHNlbGVjdGVkX2dlbmVzKQ0KDQpgYGANCg0KYGBge3IsIGZpZy5oZWlnaHQ9OCwgZmlnLndpZHRoPTEwLCBlY2hvPUZBTFNFfQ0KDQojI2RlZmluZSB0aGUgY29sb3JzIGZvciB0aGUgaGVhdG1hcCAoY2F0ZWdvcmljYWwpOiAxIGNvbG9yIGZvciBlYWNoIHNtYWxsZXN0IGV4cGVyaW1lbnRhbCB1bml0IHRoYXQgaXMgYmVpbmcgIGNvbXBhcmVkOyBpLmUuIGhlcmUgdGhlIHRyZWF0bWVudA0KY29sb3JfY2F0ZWdvcmljYWxfaGVhdG1hcCA8LSBjb2xvcl9jYXRlZ29yaWNhbF90cmVhdG1lbnQNCiNuYW1lIHRoaXMgbGlzdCBvZiBjb2xvciB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIG5hbWVzIChub3RlOiB0aGVzZSBhcmUgdGhlIHVuaXF1ZSB2YWx1ZXMgZm9yIHRoYXQgY2F0ZWdvcnkgaW4gdGhlIHNhbXBsZSBtZXRhZGF0YSkNCmNvbG9yX2NhdGVnb3JpY2FsX2hlYXRtYXBfbmFtZWQgPC0gY29sb3JfY2F0ZWdvcmljYWxfaGVhdG1hcA0KbmFtZXMoY29sb3JfY2F0ZWdvcmljYWxfaGVhdG1hcF9uYW1lZCkgPC0gdW5pcXVlKHNhbXBsZV9tZXRhZGF0YSR0cmVhdG1lbnQpDQoNCiNsb2FkIHRoaXMgaW5mb3JtYXRpb24gaW50byB0aGUgaGVhdG1hcA0KY29sQW5uIDwtIEhlYXRtYXBBbm5vdGF0aW9uKCNkZiA9IGRhdGEuZnJhbWUodHJlYXRtZW50ID0gc2FtcGxlX21ldGFkYXRhJHRyZWF0bWVudCksICN0aGUgbmFtZSBvZiB0aGUgY29sdW1uIG5lZWRzIHRvIG1hdGNoIHRoZSBuYW1lIG9mIHRoZSBuYW1lZCBsaXN0DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgI2NvbCA9IGxpc3QoInRyZWF0bWVudCIgPSBjb2xvcl9jYXRlZ29yaWNhbF9oZWF0bWFwX25hbWVkKSwgI3NldCB0aGUgbmFtZSBvZiB0aGUgbmFtZWQgbGlzdCBzbyBpdCBtYXRjaGVzDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgI2Fubm90YXRpb25fd2lkdGggPSB1bml0KGMoMSwgNCksICdjbScpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICNnYXAgPSB1bml0KDEsICdtbScpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd19sZWdlbmQgPSBGQUxTRSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG93X2Fubm90YXRpb25fbmFtZSA9IEZBTFNFLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoID0gJ2NvbCcsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgI2Fsc28gY3JlYXRlIGFuIGVtcHR5IHJvdyBhYm9lIHRoZSBoZWF0bWFwLCB0byBkaXNwbGF5IGFkZGl0aW9uYWwgaW5mbw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtcHR5MSA9IGFubm9fZW1wdHkoYm9yZGVyID0gRkFMU0UsIGhlaWdodD0gdW5pdCg4LCAibW0iKSkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApDQoNCg0KSGVhdG1hcChtYXQgPSB0KHNjYWxlKHQoY291bnRzX1ZTVF9zZWxlY3RlZGdlbmVzX3NvcnRlZCkpKSwNCiAgICAgICAgbmFtZT0gInotc2NvcmUiLA0KICAgICAgICBjb2x1bW5fdGl0bGUgPSBndF9yZW5kZXIoDQogICAgICAgICAgIlBhdHRlcm4gb2YgZXhwcmVzc2lvbiAoYXMgPHNwYW4gc3R5bGU9J2NvbG9yOmJyb3duMic+Kip6LXNjb3JlcyoqPC9zcGFuPikgPGJyLz4gb2YgYmlsZSBhY2lkcyBnZW5lcyINCiAgICAgICAgICApLA0KICAgICAgICBjb2wgPSByZXYoYnJld2VyLnBhbCgxMSwiUmRCdSIpKSwNCiAgICAgICAgbmFfY29sID0gImJsYWNrIiwNCiAgICAgICAgY2x1c3Rlcl9yb3dzID0gVCwNCiAgICAgICAgc2hvd19yb3dfZGVuZCA9IFQsDQogICAgICAgICNyb3dfb3JkZXIgPSBvcmRlcmVkX2xldmVscywNCiAgICAgICAgY2x1c3Rlcl9jb2x1bW5zID0gRkFMU0UsDQogICAgICAgIHNob3dfY29sdW1uX2RlbmQgPSBGQUxTRSwNCiAgICAgICAgI2NvbHVtbl9vcmRlciA9IG9yZGVyZWRfbGV2ZWxzLA0KICAgICAgICAjcm93X3NwbGl0ID0gZmFjdG9yKHBhc3RlMChzYW1wbGVfbWV0YWRhdGEkc2VnbWVudCwgc2FtcGxlX21ldGFkYXRhJHN0YWdlKSwgbGV2ZWxzID0gYygibGl2ZXJTMSIsICJsaXZlclM0IiwgImxpdmVyUzciLCAic3RvbWFjaFMxIiwgImludGVzdGluZVMxIiwgInN0b21hY2hTNCIsICJBX2ludGVzdGluZVM0IiwgIlBfaW50ZXN0aW5lUzQiLCAic3RvbWFjaFM3IiwgIkFfaW50ZXN0aW5lUzciLCAiUF9pbnRlc3RpbmVTNyIpKSwNCiAgICAgICAgY29sdW1uX3NwbGl0ID0gZmFjdG9yKHNhbXBsZV9tZXRhZGF0YSR0cmVhdG1lbnQsIGxldmVscyA9IGMoIkRNU08iLCAiVDNJT1AiLCAiTVBJIiwgIkNQRiIsICJDUEYuVDNJT1AiKSksDQogICAgICAgICNjbHVzdGVyX3Jvd19zbGljZXMgPSBGQUxTRSwNCiAgICAgICAgY2x1c3Rlcl9jb2x1bW5fc2xpY2VzID0gRkFMU0UsDQogICAgICAgIHJvd190aXRsZSA9IE5VTEwsDQogICAgICAgIHJvd19nYXAgPSB1bml0KDAuNSwgIm1tIiksDQogICAgICAgIGNvbHVtbl9nYXAgPSB1bml0KGMocmVwKDEwLDEpLCByZXAoMiwzKSksICJtbSIpLA0KICAgICAgICAjd2lkdGggPSB1bml0KDgsICJjbSIpLCANCiAgICAgICAgI2hlaWdodCA9IHVuaXQoOCwgImNtIiksDQogICAgICAgIGNvbHVtbl9uYW1lc19ncCA9IGdyaWQ6OmdwYXIoZm9udHNpemUgPSA4KSwNCiAgICAgICAgcm93X25hbWVzX2dwID0gZ3JpZDo6Z3Bhcihmb250c2l6ZSA9IDgpLA0KICAgICAgICB0b3BfYW5ub3RhdGlvbiA9IGNvbEFubiwNCiAgICAgICAgI2xlZnRfYW5ub3RhdGlvbiA9IHJvd0FubiwNCiAgICAgICAgc2hvd19oZWF0bWFwX2xlZ2VuZCA9IEYsDQogICAgICAgIGJvcmRlciA9IFRSVUUsDQogICAgICAgIGNsdXN0ZXJpbmdfbWV0aG9kX3Jvd3MgPSAnd2FyZC5EMicNCiAgICAgICAgKQ0KDQoNCmxpYnJhcnkoR2V0b3B0TG9uZykgICMgZm9yIHRoZSBmdW5jdGlvbiBxcSgpDQpncm91cF9ibG9ja19hbm5vID0gZnVuY3Rpb24oZ3JvdXAsIGVtcHR5X2Fubm8sIGdwID0gZ3BhcigpLCANCiAgICBsYWJlbCA9IE5VTEwsIGxhYmVsX2dwID0gZ3BhcigpKSB7DQoNCiAgICBzZWVrVmlld3BvcnQocXEoImFubm90YXRpb25fQHtlbXB0eV9hbm5vfV9Ae21pbihncm91cCl9IikpDQogICAgbG9jMSA9IGRldmljZUxvYyh4ID0gdW5pdCgwLCAibnBjIiksIHkgPSB1bml0KDAsICJucGMiKSkNCiAgICBzZWVrVmlld3BvcnQocXEoImFubm90YXRpb25fQHtlbXB0eV9hbm5vfV9Ae21heChncm91cCl9IikpDQogICAgbG9jMiA9IGRldmljZUxvYyh4ID0gdW5pdCgxLCAibnBjIiksIHkgPSB1bml0KDEsICJucGMiKSkNCg0KICAgIHNlZWtWaWV3cG9ydCgiZ2xvYmFsIikNCiAgICBncmlkLnJlY3QobG9jMSR4LCBsb2MxJHksIHdpZHRoID0gbG9jMiR4IC0gbG9jMSR4LCBoZWlnaHQgPSBsb2MyJHkgLSBsb2MxJHksIA0KICAgICAgICBqdXN0ID0gYygibGVmdCIsICJib3R0b20iKSwgZ3AgPSBncCkNCiAgICBpZighaXMubnVsbChsYWJlbCkpIHsNCiAgICAgICAgZ3JpZC50ZXh0KGxhYmVsLCB4ID0gKGxvYzEkeCArIGxvYzIkeCkqMC41LCB5ID0gKGxvYzEkeSArIGxvYzIkeSkqMC41LCBncCA9IGxhYmVsX2dwKQ0KICAgIH0NCn0NCg0KZ3JvdXBfYmxvY2tfYW5ubygxOjEsICJlbXB0eTEiLCBncCA9IGdwYXIoZmlsbCA9ICJncmF5NzAiKSwgbGFiZWwgPSAiRE1TTyIpDQpncm91cF9ibG9ja19hbm5vKDI6MiwgImVtcHR5MSIsIGdwID0gZ3BhcihmaWxsID0gInBhbGVncmVlbjMiKSwgbGFiZWwgPSAiVDMrSU9QIikNCmdyb3VwX2Jsb2NrX2Fubm8oMzozLCAiZW1wdHkxIiwgZ3AgPSBncGFyKGZpbGwgPSAibGlnaHRjb3JhbCIpLCBsYWJlbCA9ICJNUEkiKQ0KZ3JvdXBfYmxvY2tfYW5ubyg0OjQsICJlbXB0eTEiLCBncCA9IGdwYXIoZmlsbCA9ICJsaWdodHNreWJsdWUiKSwgbGFiZWwgPSAiQ1BGIikNCmdyb3VwX2Jsb2NrX2Fubm8oNTo1LCAiZW1wdHkxIiwgZ3AgPSBncGFyKGZpbGwgPSAib3JjaGlkMiIpLCBsYWJlbCA9ICJDUEYrVDMrSU9QIikNCg0KDQpgYGANCg0KIyMjIyMgTGl2ZXIgZnVuY3Rpb24NCg0KYGBge3IsIGVjaG89RkFMU0V9DQojbG9hZCB0aGUgY291bnRzX1ZTVCBvYmplY3QNCmxvYWQoIkQ6Ly9Bb2NlbGxhcmlzX0NQRl9NUElfVDMvU2F2ZWRfb2JqZWN0cy9jb3VudHNfVlNULnJkcyIpDQpgYGANCg0KYGBge3IsIGVjaG89RkFMU0V9DQojc2VsZWN0IGdlbmVzDQoNCmdlbmVsaXN0IDwtIGMoIjExMTU4MDg5MCIsICIxMTE1ODA4OTIiLCAiMTExNTgwODk0IiwgIjExMTU4MDg5NSIsI2FscGhhIDIgbWFjcm9nbG9idWxpbnMNCiAgICAgICAgICAgICAgIjExMTU3ODQxMyIsICNoZXBhdGljIGxpcGFzZQ0KICAgICAgICAgICAgICAiMTExNTc4ODAyIiwgI3RyYW5zZmVycmluDQogICAgICAgICAgICAgICIxMTE1NzI4NDkiLCAjc2VydW0gYW15bG9pZCBBDQogICAgICAgICAgICAgICIxMTE1NjU0NTMiLCAjcGxhc21pbm9nZW4NCiAgICAgICAgICAgICAgIjExMTU4MjYwMCIsICNjZXJ1bG9wbGFzbWluDQogICAgICAgICAgICAgICIxMTE1ODQwNjUiLCAjY29tcGxlbWVudEMzDQogICAgICAgICAgICAgICIxMTE1ODMzMjAiLCAjY29hZ3VsYXRpb24gZmFjdG9yIElYDQogICAgICAgICAgICAgICIxMTE1NzAyMzUiLCAjc2VsZW5vUDINCiAgICAgICAgICAgICAgIjExMTU2ODAyOSIgI3NlcnBpbmYyYQ0KDQogICAgICAgICAgICAgIA0KICAgICAgICAgICAgICApDQoNCg0KDQojYW5ub3RhdGlvbl9pbmZvW2Fubm90YXRpb25faW5mbyRlbnNlbWJsX0lEICVpbiUgZ2VuZWxpc3QsYygiZW5zZW1ibF9JRCIsICJlbnRyZXpfSUQiKV0NCg0KDQoNCnNlbGVjdGVkX2dlbmVzIDwtIGMoZ2VuZWxpc3QpDQoNCg0KDQojdGhlIHN1YnNldCBhYm92ZSB3YXMgY2hvc2VuIGJhc2VkIG9uIHRoZSBlbnNlbWJsZSBhbm5vdGF0aW9uLiBjb252ZXJ0IHRvIE5DQkkNCiNzZWxlY3RlZF9nZW5lcyA8LSBhbm5vdGF0aW9uX2luZm8kZW50cmV6X0lEW21hdGNoKHNlbGVjdGVkX2dlbmVzLCBhbm5vdGF0aW9uX2luZm8kZW5zZW1ibF9JRCldDQoNCg0KYGBgDQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KbG9hZCgiRDovL0FvY2VsbGFyaXNfQ1BGX01QSV9UMy9TYXZlZF9vYmplY3RzL0NQRl9zaWduaWZpY2FudF9nZW5lcy5yZHMiKQ0KDQpzZWxlY3RlZF9nZW5lcyA8LSBzZWxlY3RlZF9nZW5lc1tzZWxlY3RlZF9nZW5lcyAlaW4lIENQRl9zaWduaWZpY2FudF0gI29ubHkgb25lDQpgYGANCg0KDQpgYGB7ciwgZWNobz1GQUxTRX0NCiMgUmV0dXJucyB0aGUgbWlzc2luZyBnZW5lczoNCm1pc3NpbmdfZ2VuZXMgPC0gYXMuZGF0YS5mcmFtZShzZXRkaWZmKHNlbGVjdGVkX2dlbmVzLCByb3cubmFtZXMoY291bnRzX1ZTVCkpKSANCmNvbG5hbWVzKG1pc3NpbmdfZ2VuZXMpIDwtICJlbnRyZXpfSUQiDQptaXNzaW5nX2dlbmVzJGRlc2NyaXB0aW9uIDwtIGFubm90YXRpb25faW5mbyRtZXJnZWRfZGVzY3JpcHRpb25bbWF0Y2gobWlzc2luZ19nZW5lcyRlbnRyZXpfSUQsYW5ub3RhdGlvbl9pbmZvJGVudHJlel9JRCldDQojbm8gbWlzc2luZyBnZW5lcw0KDQojIFJldHVybnMgdGhlIGV4aXN0aW5nIGdlbmVzOg0Kc2VsZWN0ZWRfZ2VuZXMgPC0gYXMuZGF0YS5mcmFtZShpbnRlcnNlY3Qoc2VsZWN0ZWRfZ2VuZXMsIHJvdy5uYW1lcyhjb3VudHNfVlNUKSkpDQpjb2xuYW1lcyhzZWxlY3RlZF9nZW5lcykgPC0gImVudHJlel9JRCINCnNlbGVjdGVkX2dlbmVzJGRlc2NyaXB0aW9uIDwtIGFubm90YXRpb25faW5mbyRtZXJnZWRfZGVzY3JpcHRpb25bbWF0Y2goc2VsZWN0ZWRfZ2VuZXMkZW50cmV6X0lELGFubm90YXRpb25faW5mbyRlbnRyZXpfSUQpXQ0KDQojcHJpbnQgbGlzdCBvZiBkaWNhcmRlZCBnZW5lcyAoYmVjYXVzZSBtaXNzaW5nKSBhbmQgb2YgcmV0YWluZWQgZ2VuZXMgKGN1cmF0ZWQgZGlnZXN0aW9uIGdlbmVzLCBwcmVzZW50IGluIHRoZSBkYXRhc2V0KQ0KDQoja2FibGUobWlzc2luZ19nZW5lcywgY2FwdGlvbiA9ICJHZW5lcyBtaXNzaW5nIGZyb20gdGhlIGRhdGFzZXQgKGlnbm9yZWQpIikNCmthYmxlKHNlbGVjdGVkX2dlbmVzLCBjYXB0aW9uID0gIkdlbmVzIHByZXNlbnQgaW4gdGhlIGRhdGFzZXQgKHJldGFpbmVkKSIpDQoNCiMjIHN1YnNldCB0aGUgb3JpZ2luYWwgVlNUIG9iamVjdHMgdG8gb25seSBrZWVwIHNlbGVjdGVkIGdlbmVzDQpjb3VudHNfVlNUX3NlbGVjdGVkZ2VuZXMgPC0gc3Vic2V0KGNvdW50c19WU1QsIHJvd25hbWVzKGNvdW50c19WU1QpICVpbiUgc2VsZWN0ZWRfZ2VuZXMkZW50cmV6X0lEKQ0Kcm93bmFtZXMoY291bnRzX1ZTVF9zZWxlY3RlZGdlbmVzKSA8LSBhbm5vdGF0aW9uX2luZm8kbWVyZ2VkX2Rlc2NyaXB0aW9uW21hdGNoKHJvd25hbWVzKGNvdW50c19WU1Rfc2VsZWN0ZWRnZW5lcyksIGFubm90YXRpb25faW5mbyRlbnRyZXpfSUQpXQ0KDQojcmVtb3ZlIHVudXNlZCB2YXJpYWJsZXMNCiNybShzZWxlY3RlZF9nZW5lcykNCg0KYGBgDQoNCg0KYGBge3IsIGZpZy5oZWlnaHQ9NCwgZmlnLndpZHRoPTEwLCBlY2hvPUZBTFNFfQ0KDQojI2RlZmluZSB0aGUgY29sb3JzIGZvciB0aGUgaGVhdG1hcCAoY2F0ZWdvcmljYWwpOiAxIGNvbG9yIGZvciBlYWNoIHNtYWxsZXN0IGV4cGVyaW1lbnRhbCB1bml0IHRoYXQgaXMgYmVpbmcgIGNvbXBhcmVkOyBpLmUuIGhlcmUgdGhlIHRyZWF0bWVudA0KY29sb3JfY2F0ZWdvcmljYWxfaGVhdG1hcCA8LSBjb2xvcl9jYXRlZ29yaWNhbF90cmVhdG1lbnQNCiNuYW1lIHRoaXMgbGlzdCBvZiBjb2xvciB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIG5hbWVzIChub3RlOiB0aGVzZSBhcmUgdGhlIHVuaXF1ZSB2YWx1ZXMgZm9yIHRoYXQgY2F0ZWdvcnkgaW4gdGhlIHNhbXBsZSBtZXRhZGF0YSkNCmNvbG9yX2NhdGVnb3JpY2FsX2hlYXRtYXBfbmFtZWQgPC0gY29sb3JfY2F0ZWdvcmljYWxfaGVhdG1hcA0KbmFtZXMoY29sb3JfY2F0ZWdvcmljYWxfaGVhdG1hcF9uYW1lZCkgPC0gdW5pcXVlKHNhbXBsZV9tZXRhZGF0YSR0cmVhdG1lbnQpDQoNCiNsb2FkIHRoaXMgaW5mb3JtYXRpb24gaW50byB0aGUgaGVhdG1hcA0KY29sQW5uIDwtIEhlYXRtYXBBbm5vdGF0aW9uKCNkZiA9IGRhdGEuZnJhbWUodHJlYXRtZW50ID0gc2FtcGxlX21ldGFkYXRhJHRyZWF0bWVudCksICN0aGUgbmFtZSBvZiB0aGUgY29sdW1uIG5lZWRzIHRvIG1hdGNoIHRoZSBuYW1lIG9mIHRoZSBuYW1lZCBsaXN0DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgI2NvbCA9IGxpc3QoInRyZWF0bWVudCIgPSBjb2xvcl9jYXRlZ29yaWNhbF9oZWF0bWFwX25hbWVkKSwgI3NldCB0aGUgbmFtZSBvZiB0aGUgbmFtZWQgbGlzdCBzbyBpdCBtYXRjaGVzDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgI2Fubm90YXRpb25fd2lkdGggPSB1bml0KGMoMSwgNCksICdjbScpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICNnYXAgPSB1bml0KDEsICdtbScpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd19sZWdlbmQgPSBGQUxTRSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG93X2Fubm90YXRpb25fbmFtZSA9IEZBTFNFLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoID0gJ2NvbCcsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgI2Fsc28gY3JlYXRlIGFuIGVtcHR5IHJvdyBhYm9lIHRoZSBoZWF0bWFwLCB0byBkaXNwbGF5IGFkZGl0aW9uYWwgaW5mbw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtcHR5MSA9IGFubm9fZW1wdHkoYm9yZGVyID0gRkFMU0UsIGhlaWdodD0gdW5pdCg4LCAibW0iKSkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApDQoNCg0KSGVhdG1hcChtYXQgPSB0KHNjYWxlKHQoY291bnRzX1ZTVF9zZWxlY3RlZGdlbmVzX3NvcnRlZCkpKSwNCiAgICAgICAgbmFtZT0gInotc2NvcmUiLA0KICAgICAgICBjb2x1bW5fdGl0bGUgPSBndF9yZW5kZXIoDQogICAgICAgICAgIlBhdHRlcm4gb2YgZXhwcmVzc2lvbiAoYXMgPHNwYW4gc3R5bGU9J2NvbG9yOmJyb3duMic+Kip6LXNjb3JlcyoqPC9zcGFuPikgPGJyLz4gb2YgYmlsZSBhY2lkcyBnZW5lcyINCiAgICAgICAgICApLA0KICAgICAgICBjb2wgPSByZXYoYnJld2VyLnBhbCgxMSwiUmRCdSIpKSwNCiAgICAgICAgbmFfY29sID0gImJsYWNrIiwNCiAgICAgICAgY2x1c3Rlcl9yb3dzID0gVCwNCiAgICAgICAgc2hvd19yb3dfZGVuZCA9IFQsDQogICAgICAgICNyb3dfb3JkZXIgPSBvcmRlcmVkX2xldmVscywNCiAgICAgICAgY2x1c3Rlcl9jb2x1bW5zID0gRkFMU0UsDQogICAgICAgIHNob3dfY29sdW1uX2RlbmQgPSBGQUxTRSwNCiAgICAgICAgI2NvbHVtbl9vcmRlciA9IG9yZGVyZWRfbGV2ZWxzLA0KICAgICAgICAjcm93X3NwbGl0ID0gZmFjdG9yKHBhc3RlMChzYW1wbGVfbWV0YWRhdGEkc2VnbWVudCwgc2FtcGxlX21ldGFkYXRhJHN0YWdlKSwgbGV2ZWxzID0gYygibGl2ZXJTMSIsICJsaXZlclM0IiwgImxpdmVyUzciLCAic3RvbWFjaFMxIiwgImludGVzdGluZVMxIiwgInN0b21hY2hTNCIsICJBX2ludGVzdGluZVM0IiwgIlBfaW50ZXN0aW5lUzQiLCAic3RvbWFjaFM3IiwgIkFfaW50ZXN0aW5lUzciLCAiUF9pbnRlc3RpbmVTNyIpKSwNCiAgICAgICAgY29sdW1uX3NwbGl0ID0gZmFjdG9yKHNhbXBsZV9tZXRhZGF0YSR0cmVhdG1lbnQsIGxldmVscyA9IGMoIkRNU08iLCAiVDNJT1AiLCAiTVBJIiwgIkNQRiIsICJDUEYuVDNJT1AiKSksDQogICAgICAgICNjbHVzdGVyX3Jvd19zbGljZXMgPSBGQUxTRSwNCiAgICAgICAgY2x1c3Rlcl9jb2x1bW5fc2xpY2VzID0gRkFMU0UsDQogICAgICAgIHJvd190aXRsZSA9IE5VTEwsDQogICAgICAgIHJvd19nYXAgPSB1bml0KDAuNSwgIm1tIiksDQogICAgICAgIGNvbHVtbl9nYXAgPSB1bml0KGMocmVwKDEwLDEpLCByZXAoMiwzKSksICJtbSIpLA0KICAgICAgICAjd2lkdGggPSB1bml0KDgsICJjbSIpLCANCiAgICAgICAgI2hlaWdodCA9IHVuaXQoOCwgImNtIiksDQogICAgICAgIGNvbHVtbl9uYW1lc19ncCA9IGdyaWQ6OmdwYXIoZm9udHNpemUgPSA4KSwNCiAgICAgICAgcm93X25hbWVzX2dwID0gZ3JpZDo6Z3Bhcihmb250c2l6ZSA9IDgpLA0KICAgICAgICB0b3BfYW5ub3RhdGlvbiA9IGNvbEFubiwNCiAgICAgICAgI2xlZnRfYW5ub3RhdGlvbiA9IHJvd0FubiwNCiAgICAgICAgc2hvd19oZWF0bWFwX2xlZ2VuZCA9IEYsDQogICAgICAgIGJvcmRlciA9IFRSVUUsDQogICAgICAgIGNsdXN0ZXJpbmdfbWV0aG9kX3Jvd3MgPSAnd2FyZC5EMicNCiAgICAgICAgKQ0KDQoNCmxpYnJhcnkoR2V0b3B0TG9uZykgICMgZm9yIHRoZSBmdW5jdGlvbiBxcSgpDQpncm91cF9ibG9ja19hbm5vID0gZnVuY3Rpb24oZ3JvdXAsIGVtcHR5X2Fubm8sIGdwID0gZ3BhcigpLCANCiAgICBsYWJlbCA9IE5VTEwsIGxhYmVsX2dwID0gZ3BhcigpKSB7DQoNCiAgICBzZWVrVmlld3BvcnQocXEoImFubm90YXRpb25fQHtlbXB0eV9hbm5vfV9Ae21pbihncm91cCl9IikpDQogICAgbG9jMSA9IGRldmljZUxvYyh4ID0gdW5pdCgwLCAibnBjIiksIHkgPSB1bml0KDAsICJucGMiKSkNCiAgICBzZWVrVmlld3BvcnQocXEoImFubm90YXRpb25fQHtlbXB0eV9hbm5vfV9Ae21heChncm91cCl9IikpDQogICAgbG9jMiA9IGRldmljZUxvYyh4ID0gdW5pdCgxLCAibnBjIiksIHkgPSB1bml0KDEsICJucGMiKSkNCg0KICAgIHNlZWtWaWV3cG9ydCgiZ2xvYmFsIikNCiAgICBncmlkLnJlY3QobG9jMSR4LCBsb2MxJHksIHdpZHRoID0gbG9jMiR4IC0gbG9jMSR4LCBoZWlnaHQgPSBsb2MyJHkgLSBsb2MxJHksIA0KICAgICAgICBqdXN0ID0gYygibGVmdCIsICJib3R0b20iKSwgZ3AgPSBncCkNCiAgICBpZighaXMubnVsbChsYWJlbCkpIHsNCiAgICAgICAgZ3JpZC50ZXh0KGxhYmVsLCB4ID0gKGxvYzEkeCArIGxvYzIkeCkqMC41LCB5ID0gKGxvYzEkeSArIGxvYzIkeSkqMC41LCBncCA9IGxhYmVsX2dwKQ0KICAgIH0NCn0NCg0KZ3JvdXBfYmxvY2tfYW5ubygxOjEsICJlbXB0eTEiLCBncCA9IGdwYXIoZmlsbCA9ICJncmF5NzAiKSwgbGFiZWwgPSAiRE1TTyIpDQpncm91cF9ibG9ja19hbm5vKDI6MiwgImVtcHR5MSIsIGdwID0gZ3BhcihmaWxsID0gInBhbGVncmVlbjMiKSwgbGFiZWwgPSAiVDMrSU9QIikNCmdyb3VwX2Jsb2NrX2Fubm8oMzozLCAiZW1wdHkxIiwgZ3AgPSBncGFyKGZpbGwgPSAibGlnaHRjb3JhbCIpLCBsYWJlbCA9ICJNUEkiKQ0KZ3JvdXBfYmxvY2tfYW5ubyg0OjQsICJlbXB0eTEiLCBncCA9IGdwYXIoZmlsbCA9ICJsaWdodHNreWJsdWUiKSwgbGFiZWwgPSAiQ1BGIikNCmdyb3VwX2Jsb2NrX2Fubm8oNTo1LCAiZW1wdHkxIiwgZ3AgPSBncGFyKGZpbGwgPSAib3JjaGlkMiIpLCBsYWJlbCA9ICJDUEYrVDMrSU9QIikNCg0KDQpgYGANCg0KIyMjIyMgT3hpZGF0aXZlDQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KI2xvYWQgdGhlIGNvdW50c19WU1Qgb2JqZWN0DQpsb2FkKCJEOi8vQW9jZWxsYXJpc19DUEZfTVBJX1QzL1NhdmVkX29iamVjdHMvY291bnRzX1ZTVC5yZHMiKQ0KYGBgDQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KI3NlbGVjdCBnZW5lcw0KDQpnZW5lbGlzdCA8LSBjKCIxMTE1Nzg4MzciLCAjY2F0YWxhc2UNCiAgICAgICAgICAgICAgI3N1cGVyb3hpZGUgZGlzbXV0YXNlcw0KICAgICAgICAgICAgICAiMTExNTc1ODY0IiwgIjExMTU3NDIyMyIsICIxMTE1NzUzMzEiLCAjc29kMS8yLzMNCiAgICAgICAgICAgICAgIjExMTU3NTM1MyIsICNjY3MNCiAgICAgICAgICAgICAgI2dsdXRhdGhpb25lIHBlcm94aWRhc2VzDQogICAgICAgICAgICAgICIxMTE1NzQ5NDUiLCAiMTExNTgxOTUxIiwgI2dweDExL2IgDQogICAgICAgICAgICAgICIxMTE1ODgxNzQiLCAjZ3B4Mg0KICAgICAgICAgICAgICAiMTExNTc3Njg3IiwgI2dweDMNCiAgICAgICAgICAgICAgIjExMTU2MzQ3MyIsICIxMTE1NzEwMDciLCAjZ3B4NGEvZ3B4NGIgDQogICAgICAgICAgICAgICIxMTE1ODI1MDQiLCAjZ3B4Nw0KICAgICAgICAgICAgICAiMTExNTgwNzU3IiwgI2dweDgNCiAgICAgICAgICAgICAgIjExMTU2Nzg2MCIsICNncHg5DQogICAgICAgICAgICAgICNhbnRpb3hpZGFudCBnZW5lcw0KICAgICAgICAgICAgICAiMTExNTY5MzY2IiwgI05xbzENCiAgICAgICAgICAgICAgIjExMTU3NTUwNyIsICIxMTE1ODQ3NzgiLCAjSG8tMSAoc3BsZWVuIGxpdmVyKQ0KICAgICAgICAgICAgICAiMTExNTY5OTE1IiwgIjExMTU2NzcwNyIsICNITy0yIChpbnRlc3RpbmUpDQogICAgICAgICAgICAgICIxMTE1NzAzNzQiLCAjYmx2cmEvYmx2cmINCiAgICAgICAgICAgICAgIjExMTU2MjUyOSIsICIxMTE1NjU5NTkiLCAiMTExNTY1OTg5IiwgIjExMTU2ODU2OSIsDQogICAgICAgICAgICAgICIxMTE1NzE4MjgiLCAiMTExNTgwNDI2IiwjdWd0DQogICAgICAgICAgICAgICIxMTE1NjY0ODEiLCAiMTExNTg2MjExIiwgIjExMTU3MDYxOCIsICNHY2wNCiAgICAgICAgICAgICAgIjExMTU4MzQ4OSIsICIxMTE1NzMyMzUiLCAiMTExNTcyMjM1IiwgIjExMTU4NTIzNSIsICNFaC0xIG1pY3Jvc29tYWwgZXBveGlkZSBoeWRyb2xhc2UNCiAgICAgICAgICAgICAgIjExMTU3MjExOCIsICNTcnhuMQ0KICAgICAgICAgICAgICAjIiIsI01ycHMgbXVsdGlkcnVnIHJlc2lzdGFuY2UtYXNzb2NpYXRlZCBwcm90ZWlucw0KICAgICAgICAgICAgICAiMTExNTcyODI0IiwgIjExMTU2NDE2OCIsICNBQkMxMS9CU0VQIEFUUC1iaW5kaW5nIGNhc3NldHRlLCBzdWItZmFtaWx5IEIgbWVtYmVyIDExIChjb3VsZCBub3QgZmluZCkuIE5vdGUgdGhhdCBvbmx5IGFjYmMxYiBpcyBsaXZlciAoaS5lLiBiaWxlIHNlY3JldGlvbiksIEFiY2IxMWEgaXMgaW50ZXN0aW5hbA0KICAgICAgICAgICAgICAiMTExNTYyOTk3IiwiMTExNTYzMDE5IiwgIjExMTU2OTA1OSIsICNjZXMNCiAgICAgICAgICAgICAgICAjR1NUcyAgZ2x1dGF0aGlvbmUgUy10cmFuc2ZlcmFzZXMNCiAgICAgICAgICAgICAgIyIiLCANCiAgICAgICAgICAgICAgI3NpZ25hbGxpbmcNCiAgICAgICAgICAgICAgIjExMTU3Nzg0NyIsICNOcmYyPw0KICAgICAgICAgICAgICAiMTExNTgyOTAyIiwgIjExMTU3MDE2NSIgI0tlYXAxDQogICAgICAgICAgICAgICMiIiwgI21hZnMNCiAgICAgICAgICAgICAgKQ0KDQoNCg0KI2Fubm90YXRpb25faW5mb1thbm5vdGF0aW9uX2luZm8kZW5zZW1ibF9JRCAlaW4lIGdlbmVsaXN0LGMoImVuc2VtYmxfSUQiLCAiZW50cmV6X0lEIildDQoNCg0KDQpzZWxlY3RlZF9nZW5lcyA8LSBjKGdlbmVsaXN0KQ0KDQoNCg0KI3RoZSBzdWJzZXQgYWJvdmUgd2FzIGNob3NlbiBiYXNlZCBvbiB0aGUgZW5zZW1ibGUgYW5ub3RhdGlvbi4gY29udmVydCB0byBOQ0JJDQojc2VsZWN0ZWRfZ2VuZXMgPC0gYW5ub3RhdGlvbl9pbmZvJGVudHJlel9JRFttYXRjaChzZWxlY3RlZF9nZW5lcywgYW5ub3RhdGlvbl9pbmZvJGVuc2VtYmxfSUQpXQ0KDQoNCmBgYA0KDQoNCg0KYGBge3IsIGVjaG89RkFMU0V9DQpsb2FkKCJEOi8vQW9jZWxsYXJpc19DUEZfTVBJX1QzL1NhdmVkX29iamVjdHMvQ1BGX3NpZ25pZmljYW50X2dlbmVzLnJkcyIpDQoNCnNlbGVjdGVkX2dlbmVzIDwtIHNlbGVjdGVkX2dlbmVzW3NlbGVjdGVkX2dlbmVzICVpbiUgQ1BGX3NpZ25pZmljYW50XSAjb25seSBvbmUNCmBgYA0KDQpgYGB7ciwgZWNobz1GQUxTRX0NCiMgUmV0dXJucyB0aGUgbWlzc2luZyBnZW5lczoNCm1pc3NpbmdfZ2VuZXMgPC0gYXMuZGF0YS5mcmFtZShzZXRkaWZmKHNlbGVjdGVkX2dlbmVzLCByb3cubmFtZXMoY291bnRzX1ZTVCkpKSANCmNvbG5hbWVzKG1pc3NpbmdfZ2VuZXMpIDwtICJlbnRyZXpfSUQiDQptaXNzaW5nX2dlbmVzJGRlc2NyaXB0aW9uIDwtIGFubm90YXRpb25faW5mbyRtZXJnZWRfZGVzY3JpcHRpb25bbWF0Y2gobWlzc2luZ19nZW5lcyRlbnRyZXpfSUQsYW5ub3RhdGlvbl9pbmZvJGVudHJlel9JRCldDQojbm8gbWlzc2luZyBnZW5lcw0KDQojIFJldHVybnMgdGhlIGV4aXN0aW5nIGdlbmVzOg0Kc2VsZWN0ZWRfZ2VuZXMgPC0gYXMuZGF0YS5mcmFtZShpbnRlcnNlY3Qoc2VsZWN0ZWRfZ2VuZXMsIHJvdy5uYW1lcyhjb3VudHNfVlNUKSkpDQpjb2xuYW1lcyhzZWxlY3RlZF9nZW5lcykgPC0gImVudHJlel9JRCINCnNlbGVjdGVkX2dlbmVzJGRlc2NyaXB0aW9uIDwtIGFubm90YXRpb25faW5mbyRtZXJnZWRfZGVzY3JpcHRpb25bbWF0Y2goc2VsZWN0ZWRfZ2VuZXMkZW50cmV6X0lELGFubm90YXRpb25faW5mbyRlbnRyZXpfSUQpXQ0KDQojcHJpbnQgbGlzdCBvZiBkaWNhcmRlZCBnZW5lcyAoYmVjYXVzZSBtaXNzaW5nKSBhbmQgb2YgcmV0YWluZWQgZ2VuZXMgKGN1cmF0ZWQgZGlnZXN0aW9uIGdlbmVzLCBwcmVzZW50IGluIHRoZSBkYXRhc2V0KQ0KDQoja2FibGUobWlzc2luZ19nZW5lcywgY2FwdGlvbiA9ICJHZW5lcyBtaXNzaW5nIGZyb20gdGhlIGRhdGFzZXQgKGlnbm9yZWQpIikNCmthYmxlKHNlbGVjdGVkX2dlbmVzLCBjYXB0aW9uID0gIkdlbmVzIHByZXNlbnQgaW4gdGhlIGRhdGFzZXQgKHJldGFpbmVkKSIpDQoNCiMjIHN1YnNldCB0aGUgb3JpZ2luYWwgVlNUIG9iamVjdHMgdG8gb25seSBrZWVwIHNlbGVjdGVkIGdlbmVzDQpjb3VudHNfVlNUX3NlbGVjdGVkZ2VuZXMgPC0gc3Vic2V0KGNvdW50c19WU1QsIHJvd25hbWVzKGNvdW50c19WU1QpICVpbiUgc2VsZWN0ZWRfZ2VuZXMkZW50cmV6X0lEKQ0Kcm93bmFtZXMoY291bnRzX1ZTVF9zZWxlY3RlZGdlbmVzKSA8LSBhbm5vdGF0aW9uX2luZm8kbWVyZ2VkX2Rlc2NyaXB0aW9uW21hdGNoKHJvd25hbWVzKGNvdW50c19WU1Rfc2VsZWN0ZWRnZW5lcyksIGFubm90YXRpb25faW5mbyRlbnRyZXpfSUQpXQ0KDQojcmVtb3ZlIHVudXNlZCB2YXJpYWJsZXMNCiNybShzZWxlY3RlZF9nZW5lcykNCg0KYGBgDQoNCg0KYGBge3IsIGZpZy5oZWlnaHQ9NiwgZmlnLndpZHRoPTEwLCBlY2hvPUZBTFNFfQ0KDQojI2RlZmluZSB0aGUgY29sb3JzIGZvciB0aGUgaGVhdG1hcCAoY2F0ZWdvcmljYWwpOiAxIGNvbG9yIGZvciBlYWNoIHNtYWxsZXN0IGV4cGVyaW1lbnRhbCB1bml0IHRoYXQgaXMgYmVpbmcgIGNvbXBhcmVkOyBpLmUuIGhlcmUgdGhlIHRyZWF0bWVudA0KY29sb3JfY2F0ZWdvcmljYWxfaGVhdG1hcCA8LSBjb2xvcl9jYXRlZ29yaWNhbF90cmVhdG1lbnQNCiNuYW1lIHRoaXMgbGlzdCBvZiBjb2xvciB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIG5hbWVzIChub3RlOiB0aGVzZSBhcmUgdGhlIHVuaXF1ZSB2YWx1ZXMgZm9yIHRoYXQgY2F0ZWdvcnkgaW4gdGhlIHNhbXBsZSBtZXRhZGF0YSkNCmNvbG9yX2NhdGVnb3JpY2FsX2hlYXRtYXBfbmFtZWQgPC0gY29sb3JfY2F0ZWdvcmljYWxfaGVhdG1hcA0KbmFtZXMoY29sb3JfY2F0ZWdvcmljYWxfaGVhdG1hcF9uYW1lZCkgPC0gdW5pcXVlKHNhbXBsZV9tZXRhZGF0YSR0cmVhdG1lbnQpDQoNCiNsb2FkIHRoaXMgaW5mb3JtYXRpb24gaW50byB0aGUgaGVhdG1hcA0KY29sQW5uIDwtIEhlYXRtYXBBbm5vdGF0aW9uKCNkZiA9IGRhdGEuZnJhbWUodHJlYXRtZW50ID0gc2FtcGxlX21ldGFkYXRhJHRyZWF0bWVudCksICN0aGUgbmFtZSBvZiB0aGUgY29sdW1uIG5lZWRzIHRvIG1hdGNoIHRoZSBuYW1lIG9mIHRoZSBuYW1lZCBsaXN0DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgI2NvbCA9IGxpc3QoInRyZWF0bWVudCIgPSBjb2xvcl9jYXRlZ29yaWNhbF9oZWF0bWFwX25hbWVkKSwgI3NldCB0aGUgbmFtZSBvZiB0aGUgbmFtZWQgbGlzdCBzbyBpdCBtYXRjaGVzDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgI2Fubm90YXRpb25fd2lkdGggPSB1bml0KGMoMSwgNCksICdjbScpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICNnYXAgPSB1bml0KDEsICdtbScpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd19sZWdlbmQgPSBGQUxTRSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG93X2Fubm90YXRpb25fbmFtZSA9IEZBTFNFLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoID0gJ2NvbCcsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgI2Fsc28gY3JlYXRlIGFuIGVtcHR5IHJvdyBhYm9lIHRoZSBoZWF0bWFwLCB0byBkaXNwbGF5IGFkZGl0aW9uYWwgaW5mbw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtcHR5MSA9IGFubm9fZW1wdHkoYm9yZGVyID0gRkFMU0UsIGhlaWdodD0gdW5pdCg4LCAibW0iKSkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApDQoNCg0KSGVhdG1hcChtYXQgPSB0KHNjYWxlKHQoY291bnRzX1ZTVF9zZWxlY3RlZGdlbmVzX3NvcnRlZCkpKSwNCiAgICAgICAgbmFtZT0gInotc2NvcmUiLA0KICAgICAgICBjb2x1bW5fdGl0bGUgPSBndF9yZW5kZXIoDQogICAgICAgICAgIlBhdHRlcm4gb2YgZXhwcmVzc2lvbiAoYXMgPHNwYW4gc3R5bGU9J2NvbG9yOmJyb3duMic+Kip6LXNjb3JlcyoqPC9zcGFuPikgPGJyLz4gb2YgYmlsZSBhY2lkcyBnZW5lcyINCiAgICAgICAgICApLA0KICAgICAgICBjb2wgPSByZXYoYnJld2VyLnBhbCgxMSwiUmRCdSIpKSwNCiAgICAgICAgbmFfY29sID0gImJsYWNrIiwNCiAgICAgICAgY2x1c3Rlcl9yb3dzID0gVCwNCiAgICAgICAgc2hvd19yb3dfZGVuZCA9IFQsDQogICAgICAgICNyb3dfb3JkZXIgPSBvcmRlcmVkX2xldmVscywNCiAgICAgICAgY2x1c3Rlcl9jb2x1bW5zID0gRkFMU0UsDQogICAgICAgIHNob3dfY29sdW1uX2RlbmQgPSBGQUxTRSwNCiAgICAgICAgI2NvbHVtbl9vcmRlciA9IG9yZGVyZWRfbGV2ZWxzLA0KICAgICAgICAjcm93X3NwbGl0ID0gZmFjdG9yKHBhc3RlMChzYW1wbGVfbWV0YWRhdGEkc2VnbWVudCwgc2FtcGxlX21ldGFkYXRhJHN0YWdlKSwgbGV2ZWxzID0gYygibGl2ZXJTMSIsICJsaXZlclM0IiwgImxpdmVyUzciLCAic3RvbWFjaFMxIiwgImludGVzdGluZVMxIiwgInN0b21hY2hTNCIsICJBX2ludGVzdGluZVM0IiwgIlBfaW50ZXN0aW5lUzQiLCAic3RvbWFjaFM3IiwgIkFfaW50ZXN0aW5lUzciLCAiUF9pbnRlc3RpbmVTNyIpKSwNCiAgICAgICAgY29sdW1uX3NwbGl0ID0gZmFjdG9yKHNhbXBsZV9tZXRhZGF0YSR0cmVhdG1lbnQsIGxldmVscyA9IGMoIkRNU08iLCAiVDNJT1AiLCAiTVBJIiwgIkNQRiIsICJDUEYuVDNJT1AiKSksDQogICAgICAgICNjbHVzdGVyX3Jvd19zbGljZXMgPSBGQUxTRSwNCiAgICAgICAgY2x1c3Rlcl9jb2x1bW5fc2xpY2VzID0gRkFMU0UsDQogICAgICAgIHJvd190aXRsZSA9IE5VTEwsDQogICAgICAgIHJvd19nYXAgPSB1bml0KDAuNSwgIm1tIiksDQogICAgICAgIGNvbHVtbl9nYXAgPSB1bml0KGMocmVwKDEwLDEpLCByZXAoMiwzKSksICJtbSIpLA0KICAgICAgICAjd2lkdGggPSB1bml0KDgsICJjbSIpLCANCiAgICAgICAgI2hlaWdodCA9IHVuaXQoOCwgImNtIiksDQogICAgICAgIGNvbHVtbl9uYW1lc19ncCA9IGdyaWQ6OmdwYXIoZm9udHNpemUgPSA4KSwNCiAgICAgICAgcm93X25hbWVzX2dwID0gZ3JpZDo6Z3Bhcihmb250c2l6ZSA9IDgpLA0KICAgICAgICB0b3BfYW5ub3RhdGlvbiA9IGNvbEFubiwNCiAgICAgICAgI2xlZnRfYW5ub3RhdGlvbiA9IHJvd0FubiwNCiAgICAgICAgc2hvd19oZWF0bWFwX2xlZ2VuZCA9IEYsDQogICAgICAgIGJvcmRlciA9IFRSVUUsDQogICAgICAgIGNsdXN0ZXJpbmdfbWV0aG9kX3Jvd3MgPSAnd2FyZC5EMicNCiAgICAgICAgKQ0KDQoNCmxpYnJhcnkoR2V0b3B0TG9uZykgICMgZm9yIHRoZSBmdW5jdGlvbiBxcSgpDQpncm91cF9ibG9ja19hbm5vID0gZnVuY3Rpb24oZ3JvdXAsIGVtcHR5X2Fubm8sIGdwID0gZ3BhcigpLCANCiAgICBsYWJlbCA9IE5VTEwsIGxhYmVsX2dwID0gZ3BhcigpKSB7DQoNCiAgICBzZWVrVmlld3BvcnQocXEoImFubm90YXRpb25fQHtlbXB0eV9hbm5vfV9Ae21pbihncm91cCl9IikpDQogICAgbG9jMSA9IGRldmljZUxvYyh4ID0gdW5pdCgwLCAibnBjIiksIHkgPSB1bml0KDAsICJucGMiKSkNCiAgICBzZWVrVmlld3BvcnQocXEoImFubm90YXRpb25fQHtlbXB0eV9hbm5vfV9Ae21heChncm91cCl9IikpDQogICAgbG9jMiA9IGRldmljZUxvYyh4ID0gdW5pdCgxLCAibnBjIiksIHkgPSB1bml0KDEsICJucGMiKSkNCg0KICAgIHNlZWtWaWV3cG9ydCgiZ2xvYmFsIikNCiAgICBncmlkLnJlY3QobG9jMSR4LCBsb2MxJHksIHdpZHRoID0gbG9jMiR4IC0gbG9jMSR4LCBoZWlnaHQgPSBsb2MyJHkgLSBsb2MxJHksIA0KICAgICAgICBqdXN0ID0gYygibGVmdCIsICJib3R0b20iKSwgZ3AgPSBncCkNCiAgICBpZighaXMubnVsbChsYWJlbCkpIHsNCiAgICAgICAgZ3JpZC50ZXh0KGxhYmVsLCB4ID0gKGxvYzEkeCArIGxvYzIkeCkqMC41LCB5ID0gKGxvYzEkeSArIGxvYzIkeSkqMC41LCBncCA9IGxhYmVsX2dwKQ0KICAgIH0NCn0NCg0KZ3JvdXBfYmxvY2tfYW5ubygxOjEsICJlbXB0eTEiLCBncCA9IGdwYXIoZmlsbCA9ICJncmF5NzAiKSwgbGFiZWwgPSAiRE1TTyIpDQpncm91cF9ibG9ja19hbm5vKDI6MiwgImVtcHR5MSIsIGdwID0gZ3BhcihmaWxsID0gInBhbGVncmVlbjMiKSwgbGFiZWwgPSAiVDMrSU9QIikNCmdyb3VwX2Jsb2NrX2Fubm8oMzozLCAiZW1wdHkxIiwgZ3AgPSBncGFyKGZpbGwgPSAibGlnaHRjb3JhbCIpLCBsYWJlbCA9ICJNUEkiKQ0KZ3JvdXBfYmxvY2tfYW5ubyg0OjQsICJlbXB0eTEiLCBncCA9IGdwYXIoZmlsbCA9ICJsaWdodHNreWJsdWUiKSwgbGFiZWwgPSAiQ1BGIikNCmdyb3VwX2Jsb2NrX2Fubm8oNTo1LCAiZW1wdHkxIiwgZ3AgPSBncGFyKGZpbGwgPSAib3JjaGlkMiIpLCBsYWJlbCA9ICJDUEYrVDMrSU9QIikNCg0KDQpgYGANCg0KDQoNCiMjIyMjIEltbXVuaXR5DQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KI2xvYWQgdGhlIGNvdW50c19WU1Qgb2JqZWN0DQpsb2FkKCJEOi8vQW9jZWxsYXJpc19DUEZfTVBJX1QzL1NhdmVkX29iamVjdHMvY291bnRzX1ZTVC5yZHMiKQ0KYGBgDQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KI3NlbGVjdCBnZW5lcw0KDQoNCmdlbmVsaXN0IDwtIGMoIjExMTU2MzA2OSIsICIxMTE1NjMwNjgiLCAjY2hlbW9raW5lcyBhbmQgaW5mbGFtbWF0aW9uDQogICAgICAgICAgICAgICIxMTE1Njk1NDUiLCANCiAgICAgICAgICAgICAgIjExMTU4MDIwMCIsIA0KICAgICAgICAgICAgICAiMTExNTYyOTU1IiwgIjExMTU2Mjk1NyIsDQogICAgICAgICAgICAgICIxMTE1Nzc0MjkiLCANCiAgICAgICAgICAgICAgIjExMTU4MDQ4MyIsDQogICAgICAgICAgICAgICIxMTE1NzE4MzEiLCAiMTExNTc4Mzk5IiwgDQogICAgICAgICAgICAgICI0ODUwNjY5IiwgIjExMTU4MDUzNCIsDQogICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIjExODQ3MTgzMSIsICIxMTg0NzE4MzAiLCAjKGludGVyZmVyb24gZ2FtbWEpDQogICAgICAgICAgICAgICIxMTE1Njc2NzEiLCAiMTExNTgzOTQxIiwNCiAgICAgICAgICAgICAgIjExMTU4ODQxOSIsDQogICAgICAgICAgICAgICIxMTE1NzI0MjciLA0KICAgICAgICAgICAgICAiMTExNTY2NjE3IiwNCiAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICIxMTg0NzE2MDgiLCAiMTExNTcwNzg0IiwgIjExMTU2NjczNCIsICIxMTE1NzA3ODYiLCAjKGludGVyZmVyb24gYWxwaGEvYmV0YSAocGhpKSkNCiAgICAgICAgICAgICAgIjExMTU4ODQ5OSIsICIxMTE1ODg0NjAiLCIxMTE1ODg2MDIiLA0KICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgIjExMTU4NDYwMCIsICNpbnRlcmZlcm9uIGFuZCBpbnRlcmZlcm9uIHJlbGF0ZWQNCiAgICAgICAgICAgICAgIjExMTU3NDc2MiIsICIxMTE1NzQ3NjUiLA0KICAgICAgICAgICAgICAiMTExNTg1NDU0IiwgIjEyOTM0NzQ3NiIsDQogICAgICAgICAgICAgICIxMTE1NjI2NDYiLCAiMTExNTYyNjQ5IiwgIjExMTU3NzkxNSIsDQogICAgICAgICAgICAgICIxMTE1ODg1NTgiLA0KICAgICAgICAgICAgICAiMTExNTg0MDQ3IiwNCiAgICAgICAgICAgICAgIjExMTU4MjE1MyIsICIxMTE1ODIxNTkiLA0KICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgI251Y2xlaWMgYWNpZCBzZW5zaW5nDQogICAgICAgICAgICAgICIxMTE1ODI5MTUiLCAjdG9sbDMNCiAgICAgICAgICAgICAgIjExMTU3NTc0NCIsICNtZGE1DQogICAgICAgICAgICAgICIxMTE1ODQ3OTgiLCAiMTExNTc1MDM1IiwgIjExMTU2NjUzNSIsIjExMTU3NTEyMyIsICNSSUcNCiAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICIxMTE1ODgyODMiLCAjTUFWUw0KICAgICAgICAgICAgICAiMTExNTgzMzMxIiwNCiAgICAgICAgICAgICAgIjExMTU3Nzc5NyIsIA0KICAgICAgICAgICAgICAiMTExNTc1NzU1IiwNCiAgICAgICAgICAgICAgIjExMTU3NjQ1MCIsICIxMTE1NjgwMTciLCAiMTExNTg0MzE0IiwgIjExMTU3MTAwMiIsDQogICAgICAgICAgICAgICIxMTE1ODM1MzIiLA0KICAgICAgICAgICAgICAiMTExNTY4NzAxIiwNCiAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICIxMTE1NzY3MzgiLA0KICAgICAgICAgICAgICAiMTExNTgxNDA5IiwgIjExMTU2NzQ2MCIsICIxMTE1NzcyOTIiLCAiMTExNTY2NTY1IiwgIjExMTU4MjAxNyIsDQogICAgICAgICAgICAgICIxMTE1ODE2ODMiLA0KICAgICAgICAgICAgICAiMTExNTc3NTUxIiwgIjExMTU4MTcxMSIsDQogICAgICAgICAgICAgICIxMTE1ODM3NDgiLCAiMTExNTc3OTQ0IiwgIjExMTU4MjcxMCIsICIxMTE1NjM5OTIiLCAiMTExNTc0Njc4IiwNCiAgICAgICAgICAgICAgIjExMTU4Nzk3MCIsICIxMTE1NjM4NTciLCAiMTExNTg0NjAwIiwgIjExMTU4NDM3MiIsICNJUkZzIDEvMy83DQogICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAiMTExNTg2OTM4IiwgIjExMTU2NzYxMCIsICNjZ2FzLXN0aW5nDQogICAgICAgICAgICAgIA0KICAgICAgICAgICAgIA0KICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICIxMTE1ODgwOTUiKQ0KDQoNCg0KZ2VuZWxpc3QgPC0gYygiWCIsICNjaGVtb2tpbmVzIGFuZCBjaGVtb2tpbmUgcmVjZXB0b3JzICsgaW5mbGFtbWF0aW9uDQogICAgICAgICAgICAgICIxMTE1NjMwNjkiLCAiMTExNTYzMDY4IiwgDQogICAgICAgICAgICAgICIxMTE1Njk1NDUiLCANCiAgICAgICAgICAgICAgIjExMTU4MDIwMCIsIA0KICAgICAgICAgICAgICAiMTExNTYyOTU1IiwgIjExMTU2Mjk1NyIsDQogICAgICAgICAgICAgICIxMTE1Nzc0MjkiLCANCiAgICAgICAgICAgICAgIjExMTU4MDQ4MyIsDQogICAgICAgICAgICAgICIxMTE1NzE4MzEiLCAiMTExNTc4Mzk5IiwgDQogICAgICAgICAgICAgICI0ODUwNjY5IiwgIjExMTU4MDUzNCIsDQogICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAiMTExNTg2OTM4IiwgIjExMTU2MzkzNSIsICNkc1JOQSBzZW5zaW5nIGFuZCByZXNwb25zZQ0KICAgICAgICAgICAgICAiMTExNTg0Nzk4IiwNCiAgICAgICAgICAgICAgIjExMTU4MzMzMSIsDQogICAgICAgICAgICAgICIxMTE1Njc2MTAiLA0KICAgICAgICAgICAgICAiMTExNTc2MjUwIiwNCiAgICAgICAgICAgICAgIjExMTU3MzcxMiIsICIxMTE1NzM3MjAiLCAiMTExNTczNzM0IiwNCiAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICIxMTE1ODg2OTQiLCAjKHJlc3BvbnNlIGludm9sdmluZyBudWNsZW90aWRlcykNCiAgICAgICAgICAgICAgIjExMTU4ODY5NSIsDQogICAgICAgICAgICAgICIxMTE1NzQyNjUiLA0KICAgICAgICAgICAgICAiMTExNTYyNjQ1IiwNCiAgICAgICAgICAgICAgDQogICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAiMTExNTg0NjAwIiwgI2ludGVyZmVyb24gYW5kIGludGVyZmVyb24gcmVsYXRlZA0KICAgICAgICAgICAgICAiMTExNTc0NzYyIiwgIjExMTU3NDc2NSIsDQogICAgICAgICAgICAgICIxMTE1ODU0NTQiLCAiMTI5MzQ3NDc2IiwNCiAgICAgICAgICAgICAgIjExMTU2MjY0NiIsICIxMTE1NjI2NDkiLCAiMTExNTc3OTE1IiwNCiAgICAgICAgICAgICAgIjExMTU4ODU1OCIsDQogICAgICAgICAgICAgICIxMTE1ODQwNDciLA0KICAgICAgICAgICAgICAiMTExNTgyMTUzIiwgIjExMTU4MjE1OSIsDQogICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAiMTE4NDcxODMxIiwgIjExODQ3MTgzMCIsICMoaW50ZXJmZXJvbiBnYW1tYSkNCiAgICAgICAgICAgICAgIjExMTU2NzY3MSIsICIxMTE1ODM5NDEiLA0KICAgICAgICAgICAgICAiMTExNTg4NDE5IiwNCiAgICAgICAgICAgICAgIjExMTU3MjQyNyIsDQogICAgICAgICAgICAgICIxMTE1NjY2MTciLA0KICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgIjExODQ3MTYwOCIsICIxMTE1NzA3ODQiLCAiMTExNTY2NzM0IiwgIjExMTU3MDc4NiIsICMoaW50ZXJmZXJvbiBhbHBoYS9iZXRhIChwaGkpKQ0KICAgICAgICAgICAgICAiMTExNTg4NDk5IiwgIjExMTU4ODQ2MCIsIjExMTU4ODYwMiINCiAgICAgICAgICAgICAgKQ0KDQoNCg0KI2Fubm90YXRpb25faW5mb1thbm5vdGF0aW9uX2luZm8kZW5zZW1ibF9JRCAlaW4lIGdlbmVsaXN0LGMoImVuc2VtYmxfSUQiLCAiZW50cmV6X0lEIildDQoNCg0KDQpzZWxlY3RlZF9nZW5lcyA8LSBjKGdlbmVsaXN0KQ0KDQoNCg0KI3RoZSBzdWJzZXQgYWJvdmUgd2FzIGNob3NlbiBiYXNlZCBvbiB0aGUgZW5zZW1ibGUgYW5ub3RhdGlvbi4gY29udmVydCB0byBOQ0JJDQojc2VsZWN0ZWRfZ2VuZXMgPC0gYW5ub3RhdGlvbl9pbmZvJGVudHJlel9JRFttYXRjaChzZWxlY3RlZF9nZW5lcywgYW5ub3RhdGlvbl9pbmZvJGVuc2VtYmxfSUQpXQ0KDQoNCmBgYA0KDQpgYGB7ciwgZWNobz1GQUxTRX0NCiNvbmx5IGtlZXAgaXJpZG9waG9yZSBkZXZlbG9wbWVudCBnZW5lcyB0aGF0IGFyZSByZXNwb25zaXZlIHRvIFQzLCBpLmUuIHRoZXkgZ28gdXAgd2hlbiB5b3UgZ2l2ZSBUMyBhbmQgdGhleSBnbyBkb3duIHdoZW4geW91IGdpdmUgTVBJDQpsb2FkKCJEOi8vQW9jZWxsYXJpc19DUEZfTVBJX1QzL1NhdmVkX29iamVjdHMvVDNJT1BfdXByZWd1bGF0ZWRfZ2VuZXMucmRzIikNCmxvYWQoIkQ6Ly9Bb2NlbGxhcmlzX0NQRl9NUElfVDMvU2F2ZWRfb2JqZWN0cy9NUElfZG93bnJlZ3VsYXRlZF9nZW5lcy5yZHMiKQ0KbG9hZCgiRDovL0FvY2VsbGFyaXNfQ1BGX01QSV9UMy9TYXZlZF9vYmplY3RzL0NQRl9kb3ducmVndWxhdGVkX2dlbmVzLnJkcyIpDQpsb2FkKCJEOi8vQW9jZWxsYXJpc19DUEZfTVBJX1QzL1NhdmVkX29iamVjdHMvQ1BGX3VwcmVndWxhdGVkX2dlbmVzLnJkcyIpDQoNCnNlbGVjdGVkX2dlbmVzIDwtIHNlbGVjdGVkX2dlbmVzW3NlbGVjdGVkX2dlbmVzICVpbiUgdW5pb24oQ1BGX2Rvd25yZWd1bGF0ZWQsIENQRl91cHJlZ3VsYXRlZCldICNvbmx5IG9uZQ0KYGBgDQoNCg0KYGBge3IsIGVjaG89RkFMU0V9DQojIFJldHVybnMgdGhlIG1pc3NpbmcgZ2VuZXM6DQptaXNzaW5nX2dlbmVzIDwtIGFzLmRhdGEuZnJhbWUoc2V0ZGlmZihzZWxlY3RlZF9nZW5lcywgcm93Lm5hbWVzKGNvdW50c19WU1QpKSkgDQpjb2xuYW1lcyhtaXNzaW5nX2dlbmVzKSA8LSAiZW50cmV6X0lEIg0KbWlzc2luZ19nZW5lcyRkZXNjcmlwdGlvbiA8LSBhbm5vdGF0aW9uX2luZm8kbWVyZ2VkX2Rlc2NyaXB0aW9uW21hdGNoKG1pc3NpbmdfZ2VuZXMkZW50cmV6X0lELGFubm90YXRpb25faW5mbyRlbnRyZXpfSUQpXQ0KI25vIG1pc3NpbmcgZ2VuZXMNCg0KIyBSZXR1cm5zIHRoZSBleGlzdGluZyBnZW5lczoNCnNlbGVjdGVkX2dlbmVzIDwtIGFzLmRhdGEuZnJhbWUoaW50ZXJzZWN0KHNlbGVjdGVkX2dlbmVzLCByb3cubmFtZXMoY291bnRzX1ZTVCkpKQ0KY29sbmFtZXMoc2VsZWN0ZWRfZ2VuZXMpIDwtICJlbnRyZXpfSUQiDQpzZWxlY3RlZF9nZW5lcyRkZXNjcmlwdGlvbiA8LSBhbm5vdGF0aW9uX2luZm8kbWVyZ2VkX2Rlc2NyaXB0aW9uW21hdGNoKHNlbGVjdGVkX2dlbmVzJGVudHJlel9JRCxhbm5vdGF0aW9uX2luZm8kZW50cmV6X0lEKV0NCg0KI3ByaW50IGxpc3Qgb2YgZGljYXJkZWQgZ2VuZXMgKGJlY2F1c2UgbWlzc2luZykgYW5kIG9mIHJldGFpbmVkIGdlbmVzIChjdXJhdGVkIGRpZ2VzdGlvbiBnZW5lcywgcHJlc2VudCBpbiB0aGUgZGF0YXNldCkNCg0KI2thYmxlKG1pc3NpbmdfZ2VuZXMsIGNhcHRpb24gPSAiR2VuZXMgbWlzc2luZyBmcm9tIHRoZSBkYXRhc2V0IChpZ25vcmVkKSIpDQprYWJsZShzZWxlY3RlZF9nZW5lcywgY2FwdGlvbiA9ICJHZW5lcyBwcmVzZW50IGluIHRoZSBkYXRhc2V0IChyZXRhaW5lZCkiKQ0KDQojIyBzdWJzZXQgdGhlIG9yaWdpbmFsIFZTVCBvYmplY3RzIHRvIG9ubHkga2VlcCBzZWxlY3RlZCBnZW5lcw0KY291bnRzX1ZTVF9zZWxlY3RlZGdlbmVzIDwtIHN1YnNldChjb3VudHNfVlNULCByb3duYW1lcyhjb3VudHNfVlNUKSAlaW4lIHNlbGVjdGVkX2dlbmVzJGVudHJlel9JRCkNCnJvd25hbWVzKGNvdW50c19WU1Rfc2VsZWN0ZWRnZW5lcykgPC0gYW5ub3RhdGlvbl9pbmZvJG1lcmdlZF9kZXNjcmlwdGlvblttYXRjaChyb3duYW1lcyhjb3VudHNfVlNUX3NlbGVjdGVkZ2VuZXMpLCBhbm5vdGF0aW9uX2luZm8kZW50cmV6X0lEKV0NCg0KI3JlbW92ZSB1bnVzZWQgdmFyaWFibGVzDQojcm0oc2VsZWN0ZWRfZ2VuZXMpDQoNCmBgYA0KDQpgYGB7ciwgZWNobz1GQUxTRX0NCiNzb3J0IGJhc2VkIG9uIGltbXVuZSBjYXRlZ29yaWVzDQpjb3VudHNfVlNUX3NlbGVjdGVkZ2VuZXNfc29ydGVkIDwtIGNvdW50c19WU1Rfc2VsZWN0ZWRnZW5lcw0KY291bnRzX1ZTVF9zZWxlY3RlZGdlbmVzX3NvcnRlZCA8LSBjb3VudHNfVlNUX3NlbGVjdGVkZ2VuZXNfc29ydGVkW21hdGNoKHNlbGVjdGVkX2dlbmVzJGRlc2NyaXB0aW9uLCByb3duYW1lcyhjb3VudHNfVlNUX3NlbGVjdGVkZ2VuZXNfc29ydGVkKSksIF0NCmBgYA0KDQoNCmBgYHtyLCBmaWcuaGVpZ2h0PTYsIGZpZy53aWR0aD0xMCwgZWNobz1GQUxTRX0NCg0KIyNkZWZpbmUgdGhlIGNvbG9ycyBmb3IgdGhlIGhlYXRtYXAgKGNhdGVnb3JpY2FsKTogMSBjb2xvciBmb3IgZWFjaCBzbWFsbGVzdCBleHBlcmltZW50YWwgdW5pdCB0aGF0IGlzIGJlaW5nICBjb21wYXJlZDsgaS5lLiBoZXJlIHRoZSB0cmVhdG1lbnQNCmNvbG9yX2NhdGVnb3JpY2FsX2hlYXRtYXAgPC0gY29sb3JfY2F0ZWdvcmljYWxfdHJlYXRtZW50DQojbmFtZSB0aGlzIGxpc3Qgb2YgY29sb3Igd2l0aCB0aGUgY29ycmVzcG9uZGluZyBuYW1lcyAobm90ZTogdGhlc2UgYXJlIHRoZSB1bmlxdWUgdmFsdWVzIGZvciB0aGF0IGNhdGVnb3J5IGluIHRoZSBzYW1wbGUgbWV0YWRhdGEpDQpjb2xvcl9jYXRlZ29yaWNhbF9oZWF0bWFwX25hbWVkIDwtIGNvbG9yX2NhdGVnb3JpY2FsX2hlYXRtYXANCm5hbWVzKGNvbG9yX2NhdGVnb3JpY2FsX2hlYXRtYXBfbmFtZWQpIDwtIHVuaXF1ZShzYW1wbGVfbWV0YWRhdGEkdHJlYXRtZW50KQ0KDQojbG9hZCB0aGlzIGluZm9ybWF0aW9uIGludG8gdGhlIGhlYXRtYXANCmNvbEFubiA8LSBIZWF0bWFwQW5ub3RhdGlvbigjZGYgPSBkYXRhLmZyYW1lKHRyZWF0bWVudCA9IHNhbXBsZV9tZXRhZGF0YSR0cmVhdG1lbnQpLCAjdGhlIG5hbWUgb2YgdGhlIGNvbHVtbiBuZWVkcyB0byBtYXRjaCB0aGUgbmFtZSBvZiB0aGUgbmFtZWQgbGlzdA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICNjb2wgPSBsaXN0KCJ0cmVhdG1lbnQiID0gY29sb3JfY2F0ZWdvcmljYWxfaGVhdG1hcF9uYW1lZCksICNzZXQgdGhlIG5hbWUgb2YgdGhlIG5hbWVkIGxpc3Qgc28gaXQgbWF0Y2hlcw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICNhbm5vdGF0aW9uX3dpZHRoID0gdW5pdChjKDEsIDQpLCAnY20nKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjZ2FwID0gdW5pdCgxLCAnbW0nKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3dfbGVnZW5kID0gRkFMU0UsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd19hbm5vdGF0aW9uX25hbWUgPSBGQUxTRSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGljaCA9ICdjb2wnLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICNhbHNvIGNyZWF0ZSBhbiBlbXB0eSByb3cgYWJvZSB0aGUgaGVhdG1hcCwgdG8gZGlzcGxheSBhZGRpdGlvbmFsIGluZm8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbXB0eTEgPSBhbm5vX2VtcHR5KGJvcmRlciA9IEZBTFNFLCBoZWlnaHQ9IHVuaXQoOCwgIm1tIikpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKQ0KDQoNCkhlYXRtYXAobWF0ID0gdChzY2FsZSh0KGNvdW50c19WU1Rfc2VsZWN0ZWRnZW5lc19zb3J0ZWQpKSksDQogICAgICAgIG5hbWU9ICJ6LXNjb3JlIiwNCiAgICAgICAgY29sdW1uX3RpdGxlID0gZ3RfcmVuZGVyKA0KICAgICAgICAgICJQYXR0ZXJuIG9mIGV4cHJlc3Npb24gKGFzIDxzcGFuIHN0eWxlPSdjb2xvcjpicm93bjInPioqei1zY29yZXMqKjwvc3Bhbj4pIDxici8+IG9mIEltbXVuaXR5IGdlbmVzIg0KICAgICAgICAgICksDQogICAgICAgIGNvbCA9IHJldihicmV3ZXIucGFsKDExLCJSZEJ1IikpLA0KICAgICAgICBuYV9jb2wgPSAiYmxhY2siLA0KICAgICAgICBjbHVzdGVyX3Jvd3MgPSBGLA0KICAgICAgICBzaG93X3Jvd19kZW5kID0gRiwNCiAgICAgICAgI3Jvd19vcmRlciA9IG9yZGVyZWRfbGV2ZWxzLA0KICAgICAgICBjbHVzdGVyX2NvbHVtbnMgPSBGQUxTRSwNCiAgICAgICAgc2hvd19jb2x1bW5fZGVuZCA9IEZBTFNFLA0KICAgICAgICAjY29sdW1uX29yZGVyID0gb3JkZXJlZF9sZXZlbHMsDQogICAgICAgICNyb3dfc3BsaXQgPSBmYWN0b3IocGFzdGUwKHNhbXBsZV9tZXRhZGF0YSRzZWdtZW50LCBzYW1wbGVfbWV0YWRhdGEkc3RhZ2UpLCBsZXZlbHMgPSBjKCJsaXZlclMxIiwgImxpdmVyUzQiLCAibGl2ZXJTNyIsICJzdG9tYWNoUzEiLCAiaW50ZXN0aW5lUzEiLCAic3RvbWFjaFM0IiwgIkFfaW50ZXN0aW5lUzQiLCAiUF9pbnRlc3RpbmVTNCIsICJzdG9tYWNoUzciLCAiQV9pbnRlc3RpbmVTNyIsICJQX2ludGVzdGluZVM3IikpLA0KICAgICAgICBjb2x1bW5fc3BsaXQgPSBmYWN0b3Ioc2FtcGxlX21ldGFkYXRhJHRyZWF0bWVudCwgbGV2ZWxzID0gYygiRE1TTyIsICJUM0lPUCIsICJNUEkiLCAiQ1BGIiwgIkNQRi5UM0lPUCIpKSwNCiAgICAgICAgI2NsdXN0ZXJfcm93X3NsaWNlcyA9IEZBTFNFLA0KICAgICAgICBjbHVzdGVyX2NvbHVtbl9zbGljZXMgPSBGQUxTRSwNCiAgICAgICAgcm93X3RpdGxlID0gTlVMTCwNCiAgICAgICAgcm93X2dhcCA9IHVuaXQoMC41LCAibW0iKSwNCiAgICAgICAgY29sdW1uX2dhcCA9IHVuaXQoYyhyZXAoMTAsMSksIHJlcCgyLDMpKSwgIm1tIiksDQogICAgICAgICN3aWR0aCA9IHVuaXQoOCwgImNtIiksIA0KICAgICAgICAjaGVpZ2h0ID0gdW5pdCg4LCAiY20iKSwNCiAgICAgICAgY29sdW1uX25hbWVzX2dwID0gZ3JpZDo6Z3Bhcihmb250c2l6ZSA9IDgpLA0KICAgICAgICByb3dfbmFtZXNfZ3AgPSBncmlkOjpncGFyKGZvbnRzaXplID0gOCksDQogICAgICAgIHRvcF9hbm5vdGF0aW9uID0gY29sQW5uLA0KICAgICAgICAjbGVmdF9hbm5vdGF0aW9uID0gcm93QW5uLA0KICAgICAgICBzaG93X2hlYXRtYXBfbGVnZW5kID0gRiwNCiAgICAgICAgYm9yZGVyID0gVFJVRSwNCiAgICAgICAgY2x1c3RlcmluZ19tZXRob2Rfcm93cyA9ICd3YXJkLkQyJw0KICAgICAgICApDQoNCg0KbGlicmFyeShHZXRvcHRMb25nKSAgIyBmb3IgdGhlIGZ1bmN0aW9uIHFxKCkNCmdyb3VwX2Jsb2NrX2Fubm8gPSBmdW5jdGlvbihncm91cCwgZW1wdHlfYW5ubywgZ3AgPSBncGFyKCksIA0KICAgIGxhYmVsID0gTlVMTCwgbGFiZWxfZ3AgPSBncGFyKCkpIHsNCg0KICAgIHNlZWtWaWV3cG9ydChxcSgiYW5ub3RhdGlvbl9Ae2VtcHR5X2Fubm99X0B7bWluKGdyb3VwKX0iKSkNCiAgICBsb2MxID0gZGV2aWNlTG9jKHggPSB1bml0KDAsICJucGMiKSwgeSA9IHVuaXQoMCwgIm5wYyIpKQ0KICAgIHNlZWtWaWV3cG9ydChxcSgiYW5ub3RhdGlvbl9Ae2VtcHR5X2Fubm99X0B7bWF4KGdyb3VwKX0iKSkNCiAgICBsb2MyID0gZGV2aWNlTG9jKHggPSB1bml0KDEsICJucGMiKSwgeSA9IHVuaXQoMSwgIm5wYyIpKQ0KDQogICAgc2Vla1ZpZXdwb3J0KCJnbG9iYWwiKQ0KICAgIGdyaWQucmVjdChsb2MxJHgsIGxvYzEkeSwgd2lkdGggPSBsb2MyJHggLSBsb2MxJHgsIGhlaWdodCA9IGxvYzIkeSAtIGxvYzEkeSwgDQogICAgICAgIGp1c3QgPSBjKCJsZWZ0IiwgImJvdHRvbSIpLCBncCA9IGdwKQ0KICAgIGlmKCFpcy5udWxsKGxhYmVsKSkgew0KICAgICAgICBncmlkLnRleHQobGFiZWwsIHggPSAobG9jMSR4ICsgbG9jMiR4KSowLjUsIHkgPSAobG9jMSR5ICsgbG9jMiR5KSowLjUsIGdwID0gbGFiZWxfZ3ApDQogICAgfQ0KfQ0KDQpncm91cF9ibG9ja19hbm5vKDE6MSwgImVtcHR5MSIsIGdwID0gZ3BhcihmaWxsID0gImdyYXk3MCIpLCBsYWJlbCA9ICJETVNPIikNCmdyb3VwX2Jsb2NrX2Fubm8oMjoyLCAiZW1wdHkxIiwgZ3AgPSBncGFyKGZpbGwgPSAicGFsZWdyZWVuMyIpLCBsYWJlbCA9ICJUMytJT1AiKQ0KZ3JvdXBfYmxvY2tfYW5ubygzOjMsICJlbXB0eTEiLCBncCA9IGdwYXIoZmlsbCA9ICJsaWdodGNvcmFsIiksIGxhYmVsID0gIk1QSSIpDQpncm91cF9ibG9ja19hbm5vKDQ6NCwgImVtcHR5MSIsIGdwID0gZ3BhcihmaWxsID0gImxpZ2h0c2t5Ymx1ZSIpLCBsYWJlbCA9ICJDUEYiKQ0KZ3JvdXBfYmxvY2tfYW5ubyg1OjUsICJlbXB0eTEiLCBncCA9IGdwYXIoZmlsbCA9ICJvcmNoaWQyIiksIGxhYmVsID0gIkNQRitUMytJT1AiKQ0KDQoNCmBgYA0KDQoNCiMjIyMjIEROQV9yZXBhaXINCg0KYGBge3IsIGVjaG89RkFMU0V9DQojbG9hZCB0aGUgY291bnRzX1ZTVCBvYmplY3QNCmxvYWQoIkQ6Ly9Bb2NlbGxhcmlzX0NQRl9NUElfVDMvU2F2ZWRfb2JqZWN0cy9jb3VudHNfVlNULnJkcyIpDQpgYGANCg0KYGBge3IsIGVjaG89RkFMU0V9DQojc2VsZWN0IGdlbmVzDQoNCmdlbmVsaXN0IDwtIGMoIjExMTU3MTc3OCIsICNFMkYxIHBhdGh3YXkNCiAgICAgICAgICAgICAgIjExMTU3NzY0NCIsDQogICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAiMTExNTg0NjU3IiwgI2NlbGwgbWVtYnJhbmUgZGFtYWdlDQogICAgICAgICAgICAgICIxMTE1NzQzNzIiLCAjc2VuZXNjZW5jZS9jZWxsIGN5Y2xlDQogICAgICAgICAgICAgICIxMTE1ODI4OTUiLCANCiAgICAgICAgICAgICAgIjExMTU3NzE4NyIsDQogICAgICAgICAgICAgICIxMTE1ODg5NDIiLA0KICAgICAgICAgICAgICAiMTExNTczMDU3IiwNCiAgICAgICAgICAgICAgIjExMTU2MzQzNCIsDQogICAgICAgICAgICAgICIxMTE1ODA2NTIiLA0KICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgIjExMTU2MzY0MiIsICNjZWxsIGN5Y2xlDQogICAgICAgICAgICAgICIxMTE1ODE0NDUiLCAiMTExNTY0NDExIiwgIjExMTU2Mjg0OSIsDQogICAgICAgICAgICAgICIxMTE1NzYzMzUiLCAiMTExNTY4Mzc1IiwNCiAgICAgICAgICAgICAgIjExMTU3OTczMSIsDQogICAgICAgICAgICAgICIxMTE1ODgyNTQiLCAiMTExNTc4MTc2IiwNCiAgICAgICAgICAgICAgIjExMTU3NDAzMSIsICIxMTE1ODI0MzIiLCAiMTExNTY5MjUxIiwNCiAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICIxMTE1NzQ0MDIiLCAjTkhFSg0KICAgICAgICAgICAgICAiMTExNTg4NTgwIiwNCiAgICAgICAgICAgICAgIjExMTU2NTQxNSIsICIxMTE1NzQ1NjIiLA0KICAgICAgICAgICAgICAiMTExNTc4NjczIiwNCiAgICAgICAgICAgICAgIjExMTU4MjgzOSIsDQogICAgICAgICAgICAgICIxMTE1ODA2MjciLCAiMTExNTc2MDIyIiwNCiAgICAgICAgICAgICAgIjExMTU2NjU1NiIsDQogICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAiMTExNTY4NzMxIiwgIyBEU0IgYW5kIEhSL0ZhbmNvbmkNCiAgICAgICAgICAgICAgIjExMTU4NTU0MiIsDQogICAgICAgICAgICAgICIxMTE1NzY2NjciLA0KICAgICAgICAgICAgICAiMTExNTY2OTkzIiwNCiAgICAgICAgICAgICAgIjExMTU3MDIwMyIsICIxMTE1ODQxMDkiLA0KICAgICAgICAgICAgICAiMTExNTg0ODYzIiwNCiAgICAgICAgICAgICAgIjExMTU3MzIxNyIsDQogICAgICAgICAgICAgICIxMTE1ODYwMDkiLA0KICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgIjExMTU4MTkwNCIsDQogICAgICAgICAgICAgICIxMTE1NjMwODIiLA0KICAgICAgICAgICAgICAiMTExNTY3MzA2IiwNCiAgICAgICAgICAgICAgIjExMTU4MTIyOCIsDQogICAgICAgICAgICAgICIxMTE1ODcwODYiLCAiMTExNTcwNTAwIiwgIjExMTU4Njc5OCIsDQogICAgICAgICAgICAgICIxMTE1NzI4ODciLA0KICAgICAgICAgICAgICAiMTExNTY2MjY1IiwNCiAgICAgICAgICAgICAgIjExMTU2MzY2OCIsDQogICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAiMTExNTc1MTY4IiwgI3JhZCBkc2IgZGV0ZWN0aW9uDQogICAgICAgICAgICAgICIxMTE1NzE0ODQiLA0KICAgICAgICAgICAgICAiMTExNTgyNzg3IiwNCiAgICAgICAgICAgICAgIjExMTU4MTc1NiIsDQogICAgICAgICAgICAgICIxMTE1ODA4MzMiLA0KICAgICAgICAgICAgICAiMTExNTg4MTQzIiwNCiAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICIxMTE1NjQwNjgiLCAjaW50ZXJzdHJhbmQgY3Jvc3NsaW5rIHJlcGFpcg0KICAgICAgICAgICAgICAiMTExNTc5OTExIiwNCiAgICAgICAgICAgICAgIjExMTU3OTQ0MSIsDQogICAgICAgICAgICAgICIxMTE1Nzc3MTQiLA0KICAgICAgICAgICAgICAiMTExNTY5OTA2IiwNCiAgICAgICAgICAgICAgIjExMTU4MTUxMiIsDQogICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAiMTExNTg4NTU0IiwgI2Jhc2UgZXhjaXNpb24gcmVwYWlyDQogICAgICAgICAgICAgICIxMTE1NzAzODkiLA0KICAgICAgICAgICAgICAiMTExNTg3NjQzIiwNCiAgICAgICAgICAgICAgIjExMTU2Nzg3OSIsDQogICAgICAgICAgICAgICIxMTE1Njc4ODIiLA0KICAgICAgICAgICAgICAiMTExNTgzNzkyIiwNCiAgICAgICAgICAgICAgIjExMTU4MzkwMiIsDQogICAgICAgICAgICAgICIxMTE1NzQ4MzkiLA0KICAgICAgICAgICAgICAiMTExNTcxOTA4IiwNCiAgICAgICAgICAgICAgIjExMTU4NzkwMiIsDQogICAgICAgICAgICAgICIxMTE1ODE1MTIiLA0KICAgICAgICAgICAgICAiMTExNTgwNjA0IiwgIjExMTU4ODMzOSIsDQogICAgICAgICAgICAgICIxMTE1NzcyNzIiLA0KICAgICAgICAgICAgICAiMTExNTc0NTA4IiwNCiAgICAgICAgICAgICAgIjExMTU3NDYyNSIsDQogICAgICAgICAgICAgICIxMTE1NzE0ODMiLA0KICAgICAgICAgICAgICAiMTExNTcyNTA0IiwNCiAgICAgICAgICAgICAgIjExMTU3MTk4OSIsDQogICAgICAgICAgICAgIA0KICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgIjExMTU3NjUwNSIsICNzc0ROQQ0KICAgICAgICAgICAgICAiMTExNTY3MTczIiwNCiAgICAgICAgICAgICAgIjExMTU3ODY3OSIsDQogICAgICAgICAgICAgICIxMTE1NzY2MzEiLA0KICAgICAgICAgICAgICAiMTExNTY1MTM1IiwNCiAgICAgICAgICAgICAgIjExMTU2MzgzNiIsDQogICAgICAgICAgICAgICIxMTE1ODcwMzkiLA0KICAgICAgICAgICAgICAiMTExNTY5MDIyIiwNCiAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICIxMTE1Njk3MjYiLA0KICAgICAgICAgICAgICAiMTExNTYzMzgxIiwNCiAgICAgICAgICAgICAgIjExMTU3NTE3NCIsDQogICAgICAgICAgICAgICIxMTE1ODI0MTYiLA0KICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgIjExMTU3Nzg5NiIsICNtaXNtYXRjaCByZXBhaXINCiAgICAgICAgICAgICAgIjExMTU2NzE4NCIsDQogICAgICAgICAgICAgICIxMTE1NjQ3MDEiLA0KICAgICAgICAgICAgICAiMTExNTczMDk3IiwNCiAgICAgICAgICAgICAgIjExMTU3NDU3NCIsDQogICAgICAgICAgICAgICIxMTE1NzUzNzEiLA0KICAgICAgICAgICAgICAiMTExNTY0NDIxIiwNCiAgICAgICAgICAgICAgIjExMTU4NjY5MSINCiAgICAgICAgICAgIA0KICAgICAgICAgICAgICApDQoNCg0KDQojYW5ub3RhdGlvbl9pbmZvW2Fubm90YXRpb25faW5mbyRlbnNlbWJsX0lEICVpbiUgZ2VuZWxpc3QsYygiZW5zZW1ibF9JRCIsICJlbnRyZXpfSUQiKV0NCg0KDQoNCnNlbGVjdGVkX2dlbmVzIDwtIGMoZ2VuZWxpc3QpDQoNCg0KDQojdGhlIHN1YnNldCBhYm92ZSB3YXMgY2hvc2VuIGJhc2VkIG9uIHRoZSBlbnNlbWJsZSBhbm5vdGF0aW9uLiBjb252ZXJ0IHRvIE5DQkkNCiNzZWxlY3RlZF9nZW5lcyA8LSBhbm5vdGF0aW9uX2luZm8kZW50cmV6X0lEW21hdGNoKHNlbGVjdGVkX2dlbmVzLCBhbm5vdGF0aW9uX2luZm8kZW5zZW1ibF9JRCldDQoNCg0KYGBgDQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KbG9hZCgiRDovL0FvY2VsbGFyaXNfQ1BGX01QSV9UMy9TYXZlZF9vYmplY3RzL1QzSU9QX3VwcmVndWxhdGVkX2dlbmVzLnJkcyIpDQpsb2FkKCJEOi8vQW9jZWxsYXJpc19DUEZfTVBJX1QzL1NhdmVkX29iamVjdHMvTVBJX2Rvd25yZWd1bGF0ZWRfZ2VuZXMucmRzIikNCmxvYWQoIkQ6Ly9Bb2NlbGxhcmlzX0NQRl9NUElfVDMvU2F2ZWRfb2JqZWN0cy9DUEZfZG93bnJlZ3VsYXRlZF9nZW5lcy5yZHMiKQ0KbG9hZCgiRDovL0FvY2VsbGFyaXNfQ1BGX01QSV9UMy9TYXZlZF9vYmplY3RzL0NQRl91cHJlZ3VsYXRlZF9nZW5lcy5yZHMiKQ0KDQpzZWxlY3RlZF9nZW5lcyA8LSBzZWxlY3RlZF9nZW5lc1tzZWxlY3RlZF9nZW5lcyAlaW4lIHVuaW9uKENQRl9kb3ducmVndWxhdGVkLCBDUEZfdXByZWd1bGF0ZWQpXSAjb25seSBvbmUNCmBgYA0KDQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KIyBSZXR1cm5zIHRoZSBtaXNzaW5nIGdlbmVzOg0KbWlzc2luZ19nZW5lcyA8LSBhcy5kYXRhLmZyYW1lKHNldGRpZmYoc2VsZWN0ZWRfZ2VuZXMsIHJvdy5uYW1lcyhjb3VudHNfVlNUKSkpIA0KY29sbmFtZXMobWlzc2luZ19nZW5lcykgPC0gImVudHJlel9JRCINCm1pc3NpbmdfZ2VuZXMkZGVzY3JpcHRpb24gPC0gYW5ub3RhdGlvbl9pbmZvJG1lcmdlZF9kZXNjcmlwdGlvblttYXRjaChtaXNzaW5nX2dlbmVzJGVudHJlel9JRCxhbm5vdGF0aW9uX2luZm8kZW50cmV6X0lEKV0NCiNubyBtaXNzaW5nIGdlbmVzDQoNCiMgUmV0dXJucyB0aGUgZXhpc3RpbmcgZ2VuZXM6DQpzZWxlY3RlZF9nZW5lcyA8LSBhcy5kYXRhLmZyYW1lKGludGVyc2VjdChzZWxlY3RlZF9nZW5lcywgcm93Lm5hbWVzKGNvdW50c19WU1QpKSkNCmNvbG5hbWVzKHNlbGVjdGVkX2dlbmVzKSA8LSAiZW50cmV6X0lEIg0Kc2VsZWN0ZWRfZ2VuZXMkZGVzY3JpcHRpb24gPC0gYW5ub3RhdGlvbl9pbmZvJG1lcmdlZF9kZXNjcmlwdGlvblttYXRjaChzZWxlY3RlZF9nZW5lcyRlbnRyZXpfSUQsYW5ub3RhdGlvbl9pbmZvJGVudHJlel9JRCldDQoNCiNwcmludCBsaXN0IG9mIGRpY2FyZGVkIGdlbmVzIChiZWNhdXNlIG1pc3NpbmcpIGFuZCBvZiByZXRhaW5lZCBnZW5lcyAoY3VyYXRlZCBkaWdlc3Rpb24gZ2VuZXMsIHByZXNlbnQgaW4gdGhlIGRhdGFzZXQpDQoNCiNrYWJsZShtaXNzaW5nX2dlbmVzLCBjYXB0aW9uID0gIkdlbmVzIG1pc3NpbmcgZnJvbSB0aGUgZGF0YXNldCAoaWdub3JlZCkiKQ0Ka2FibGUoc2VsZWN0ZWRfZ2VuZXMsIGNhcHRpb24gPSAiR2VuZXMgcHJlc2VudCBpbiB0aGUgZGF0YXNldCAocmV0YWluZWQpIikNCg0KIyMgc3Vic2V0IHRoZSBvcmlnaW5hbCBWU1Qgb2JqZWN0cyB0byBvbmx5IGtlZXAgc2VsZWN0ZWQgZ2VuZXMNCmNvdW50c19WU1Rfc2VsZWN0ZWRnZW5lcyA8LSBzdWJzZXQoY291bnRzX1ZTVCwgcm93bmFtZXMoY291bnRzX1ZTVCkgJWluJSBzZWxlY3RlZF9nZW5lcyRlbnRyZXpfSUQpDQpyb3duYW1lcyhjb3VudHNfVlNUX3NlbGVjdGVkZ2VuZXMpIDwtIGFubm90YXRpb25faW5mbyRtZXJnZWRfZGVzY3JpcHRpb25bbWF0Y2gocm93bmFtZXMoY291bnRzX1ZTVF9zZWxlY3RlZGdlbmVzKSwgYW5ub3RhdGlvbl9pbmZvJGVudHJlel9JRCldDQoNCiNyZW1vdmUgdW51c2VkIHZhcmlhYmxlcw0KI3JtKHNlbGVjdGVkX2dlbmVzKQ0KDQpgYGANCg0KYGBge3IsIGVjaG89RkFMU0V9DQojc29ydCBiYXNlZCBvbiBETkEgcmVwYWlyIGZhbWlsaWVzDQpjb3VudHNfVlNUX3NlbGVjdGVkZ2VuZXNfc29ydGVkIDwtIGNvdW50c19WU1Rfc2VsZWN0ZWRnZW5lcw0KY291bnRzX1ZTVF9zZWxlY3RlZGdlbmVzX3NvcnRlZCA8LSBjb3VudHNfVlNUX3NlbGVjdGVkZ2VuZXNfc29ydGVkW21hdGNoKHNlbGVjdGVkX2dlbmVzJGRlc2NyaXB0aW9uLCByb3duYW1lcyhjb3VudHNfVlNUX3NlbGVjdGVkZ2VuZXNfc29ydGVkKSksIF0NCmBgYA0KDQoNCmBgYHtyLCBmaWcuaGVpZ2h0PTYsIGZpZy53aWR0aD0xMCwgZWNobz1GQUxTRX0NCg0KIyNkZWZpbmUgdGhlIGNvbG9ycyBmb3IgdGhlIGhlYXRtYXAgKGNhdGVnb3JpY2FsKTogMSBjb2xvciBmb3IgZWFjaCBzbWFsbGVzdCBleHBlcmltZW50YWwgdW5pdCB0aGF0IGlzIGJlaW5nICBjb21wYXJlZDsgaS5lLiBoZXJlIHRoZSB0cmVhdG1lbnQNCmNvbG9yX2NhdGVnb3JpY2FsX2hlYXRtYXAgPC0gY29sb3JfY2F0ZWdvcmljYWxfdHJlYXRtZW50DQojbmFtZSB0aGlzIGxpc3Qgb2YgY29sb3Igd2l0aCB0aGUgY29ycmVzcG9uZGluZyBuYW1lcyAobm90ZTogdGhlc2UgYXJlIHRoZSB1bmlxdWUgdmFsdWVzIGZvciB0aGF0IGNhdGVnb3J5IGluIHRoZSBzYW1wbGUgbWV0YWRhdGEpDQpjb2xvcl9jYXRlZ29yaWNhbF9oZWF0bWFwX25hbWVkIDwtIGNvbG9yX2NhdGVnb3JpY2FsX2hlYXRtYXANCm5hbWVzKGNvbG9yX2NhdGVnb3JpY2FsX2hlYXRtYXBfbmFtZWQpIDwtIHVuaXF1ZShzYW1wbGVfbWV0YWRhdGEkdHJlYXRtZW50KQ0KDQojbG9hZCB0aGlzIGluZm9ybWF0aW9uIGludG8gdGhlIGhlYXRtYXANCmNvbEFubiA8LSBIZWF0bWFwQW5ub3RhdGlvbigjZGYgPSBkYXRhLmZyYW1lKHRyZWF0bWVudCA9IHNhbXBsZV9tZXRhZGF0YSR0cmVhdG1lbnQpLCAjdGhlIG5hbWUgb2YgdGhlIGNvbHVtbiBuZWVkcyB0byBtYXRjaCB0aGUgbmFtZSBvZiB0aGUgbmFtZWQgbGlzdA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICNjb2wgPSBsaXN0KCJ0cmVhdG1lbnQiID0gY29sb3JfY2F0ZWdvcmljYWxfaGVhdG1hcF9uYW1lZCksICNzZXQgdGhlIG5hbWUgb2YgdGhlIG5hbWVkIGxpc3Qgc28gaXQgbWF0Y2hlcw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICNhbm5vdGF0aW9uX3dpZHRoID0gdW5pdChjKDEsIDQpLCAnY20nKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjZ2FwID0gdW5pdCgxLCAnbW0nKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3dfbGVnZW5kID0gRkFMU0UsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd19hbm5vdGF0aW9uX25hbWUgPSBGQUxTRSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGljaCA9ICdjb2wnLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICNhbHNvIGNyZWF0ZSBhbiBlbXB0eSByb3cgYWJvZSB0aGUgaGVhdG1hcCwgdG8gZGlzcGxheSBhZGRpdGlvbmFsIGluZm8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbXB0eTEgPSBhbm5vX2VtcHR5KGJvcmRlciA9IEZBTFNFLCBoZWlnaHQ9IHVuaXQoOCwgIm1tIikpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKQ0KDQoNCkhlYXRtYXAobWF0ID0gdChzY2FsZSh0KGNvdW50c19WU1Rfc2VsZWN0ZWRnZW5lc19zb3J0ZWQpKSksDQogICAgICAgIG5hbWU9ICJ6LXNjb3JlIiwNCiAgICAgICAgY29sdW1uX3RpdGxlID0gZ3RfcmVuZGVyKA0KICAgICAgICAgICJQYXR0ZXJuIG9mIGV4cHJlc3Npb24gKGFzIDxzcGFuIHN0eWxlPSdjb2xvcjpicm93bjInPioqei1zY29yZXMqKjwvc3Bhbj4pIDxici8+IG9mIEltbXVuaXR5IGdlbmVzIg0KICAgICAgICAgICksDQogICAgICAgIGNvbCA9IHJldihicmV3ZXIucGFsKDExLCJSZEJ1IikpLA0KICAgICAgICBuYV9jb2wgPSAiYmxhY2siLA0KICAgICAgICBjbHVzdGVyX3Jvd3MgPSBGLA0KICAgICAgICBzaG93X3Jvd19kZW5kID0gRiwNCiAgICAgICAgI3Jvd19vcmRlciA9IG9yZGVyZWRfbGV2ZWxzLA0KICAgICAgICBjbHVzdGVyX2NvbHVtbnMgPSBGQUxTRSwNCiAgICAgICAgc2hvd19jb2x1bW5fZGVuZCA9IEZBTFNFLA0KICAgICAgICAjY29sdW1uX29yZGVyID0gb3JkZXJlZF9sZXZlbHMsDQogICAgICAgICNyb3dfc3BsaXQgPSBmYWN0b3IocGFzdGUwKHNhbXBsZV9tZXRhZGF0YSRzZWdtZW50LCBzYW1wbGVfbWV0YWRhdGEkc3RhZ2UpLCBsZXZlbHMgPSBjKCJsaXZlclMxIiwgImxpdmVyUzQiLCAibGl2ZXJTNyIsICJzdG9tYWNoUzEiLCAiaW50ZXN0aW5lUzEiLCAic3RvbWFjaFM0IiwgIkFfaW50ZXN0aW5lUzQiLCAiUF9pbnRlc3RpbmVTNCIsICJzdG9tYWNoUzciLCAiQV9pbnRlc3RpbmVTNyIsICJQX2ludGVzdGluZVM3IikpLA0KICAgICAgICBjb2x1bW5fc3BsaXQgPSBmYWN0b3Ioc2FtcGxlX21ldGFkYXRhJHRyZWF0bWVudCwgbGV2ZWxzID0gYygiRE1TTyIsICJUM0lPUCIsICJNUEkiLCAiQ1BGIiwgIkNQRi5UM0lPUCIpKSwNCiAgICAgICAgI2NsdXN0ZXJfcm93X3NsaWNlcyA9IEZBTFNFLA0KICAgICAgICBjbHVzdGVyX2NvbHVtbl9zbGljZXMgPSBGQUxTRSwNCiAgICAgICAgcm93X3RpdGxlID0gTlVMTCwNCiAgICAgICAgcm93X2dhcCA9IHVuaXQoMC41LCAibW0iKSwNCiAgICAgICAgY29sdW1uX2dhcCA9IHVuaXQoYyhyZXAoMTAsMSksIHJlcCgyLDMpKSwgIm1tIiksDQogICAgICAgICN3aWR0aCA9IHVuaXQoOCwgImNtIiksIA0KICAgICAgICAjaGVpZ2h0ID0gdW5pdCg4LCAiY20iKSwNCiAgICAgICAgY29sdW1uX25hbWVzX2dwID0gZ3JpZDo6Z3Bhcihmb250c2l6ZSA9IDgpLA0KICAgICAgICByb3dfbmFtZXNfZ3AgPSBncmlkOjpncGFyKGZvbnRzaXplID0gOCksDQogICAgICAgIHRvcF9hbm5vdGF0aW9uID0gY29sQW5uLA0KICAgICAgICAjbGVmdF9hbm5vdGF0aW9uID0gcm93QW5uLA0KICAgICAgICBzaG93X2hlYXRtYXBfbGVnZW5kID0gRiwNCiAgICAgICAgYm9yZGVyID0gVFJVRSwNCiAgICAgICAgY2x1c3RlcmluZ19tZXRob2Rfcm93cyA9ICd3YXJkLkQyJw0KICAgICAgICApDQoNCg0KbGlicmFyeShHZXRvcHRMb25nKSAgIyBmb3IgdGhlIGZ1bmN0aW9uIHFxKCkNCmdyb3VwX2Jsb2NrX2Fubm8gPSBmdW5jdGlvbihncm91cCwgZW1wdHlfYW5ubywgZ3AgPSBncGFyKCksIA0KICAgIGxhYmVsID0gTlVMTCwgbGFiZWxfZ3AgPSBncGFyKCkpIHsNCg0KICAgIHNlZWtWaWV3cG9ydChxcSgiYW5ub3RhdGlvbl9Ae2VtcHR5X2Fubm99X0B7bWluKGdyb3VwKX0iKSkNCiAgICBsb2MxID0gZGV2aWNlTG9jKHggPSB1bml0KDAsICJucGMiKSwgeSA9IHVuaXQoMCwgIm5wYyIpKQ0KICAgIHNlZWtWaWV3cG9ydChxcSgiYW5ub3RhdGlvbl9Ae2VtcHR5X2Fubm99X0B7bWF4KGdyb3VwKX0iKSkNCiAgICBsb2MyID0gZGV2aWNlTG9jKHggPSB1bml0KDEsICJucGMiKSwgeSA9IHVuaXQoMSwgIm5wYyIpKQ0KDQogICAgc2Vla1ZpZXdwb3J0KCJnbG9iYWwiKQ0KICAgIGdyaWQucmVjdChsb2MxJHgsIGxvYzEkeSwgd2lkdGggPSBsb2MyJHggLSBsb2MxJHgsIGhlaWdodCA9IGxvYzIkeSAtIGxvYzEkeSwgDQogICAgICAgIGp1c3QgPSBjKCJsZWZ0IiwgImJvdHRvbSIpLCBncCA9IGdwKQ0KICAgIGlmKCFpcy5udWxsKGxhYmVsKSkgew0KICAgICAgICBncmlkLnRleHQobGFiZWwsIHggPSAobG9jMSR4ICsgbG9jMiR4KSowLjUsIHkgPSAobG9jMSR5ICsgbG9jMiR5KSowLjUsIGdwID0gbGFiZWxfZ3ApDQogICAgfQ0KfQ0KDQpncm91cF9ibG9ja19hbm5vKDE6MSwgImVtcHR5MSIsIGdwID0gZ3BhcihmaWxsID0gImdyYXk3MCIpLCBsYWJlbCA9ICJETVNPIikNCmdyb3VwX2Jsb2NrX2Fubm8oMjoyLCAiZW1wdHkxIiwgZ3AgPSBncGFyKGZpbGwgPSAicGFsZWdyZWVuMyIpLCBsYWJlbCA9ICJUMytJT1AiKQ0KZ3JvdXBfYmxvY2tfYW5ubygzOjMsICJlbXB0eTEiLCBncCA9IGdwYXIoZmlsbCA9ICJsaWdodGNvcmFsIiksIGxhYmVsID0gIk1QSSIpDQpncm91cF9ibG9ja19hbm5vKDQ6NCwgImVtcHR5MSIsIGdwID0gZ3BhcihmaWxsID0gImxpZ2h0c2t5Ymx1ZSIpLCBsYWJlbCA9ICJDUEYiKQ0KZ3JvdXBfYmxvY2tfYW5ubyg1OjUsICJlbXB0eTEiLCBncCA9IGdwYXIoZmlsbCA9ICJvcmNoaWQyIiksIGxhYmVsID0gIkNQRitUMytJT1AiKQ0KDQoNCmBgYA0KDQoNCiMjIyMjIFVQIFQzIGFuZCBDUEYgKHNlbGVjdGVkKQ0KDQpgYGB7ciwgZWNobz1GQUxTRX0NCiNsb2FkIHRoZSBjb3VudHNfVlNUIG9iamVjdA0KbG9hZCgiRDovL0FvY2VsbGFyaXNfQ1BGX01QSV9UMy9TYXZlZF9vYmplY3RzL2NvdW50c19WU1QucmRzIikNCmxvYWQoIkQ6Ly9Bb2NlbGxhcmlzX0NQRl9NUElfVDMvU2F2ZWRfb2JqZWN0cy9zYW1wbGVfbWV0YWRhdGEucmRzIikNCmBgYA0KDQpgYGB7ciwgZWNobz1GQUxTRX0NCiNsb2FkIGxpc3Qgb2YgZ2VuZXMNCnVwcmVndWxhdGVkX0NQRmFuZFQzSU9QX2RmIDwtIHJlYWQuY3N2KGZpbGU9IkQ6Ly9Bb2NlbGxhcmlzX0NQRl9NUElfVDMvU2F2ZWRfb2JqZWN0cy9WZW5uL3VwcmVndWxhdGVkX0NQRmFuZFQzSU9QX2NsZWFuLmNzdiIpDQoNCiNsb2FkIGRpZmZlcmVudGlhbGx5IGV4cHJlc3NlZCBnZW5lcyBiZXR3ZWVuIFMxIGFuZCBTNywgcmFua2VkIGJ5IEZDDQpERV9nZW5lcyA8LSB1cHJlZ3VsYXRlZF9DUEZhbmRUM0lPUF9kZiRlbnNlbWJsX0lEX0NQRg0KDQojc2VsZWN0IGdlbmVzDQoNCmdlbmVsaXN0IDwtIGMoIjExMTU2NTYwNiIsICIxMTE1NjU3ODUiLCAiMTExNTY5NTQ1IiwNCiAgICAgICAgICAgICAgIyIxMTE1ODg1NTciLCAiMTExNTg0Njg3IiwgIjExMTU4NjY1OSIsDQogICAgICAgICAgICAgICIxMTE1NjU2MDMiLCAiMTI5MzUwNjA5IiwgIjExMTU2NjYxNyIsIA0KICAgICAgICAgICAgICAiMTExNTg0NTgzIiwgIjExMTU2MjcxMyIsICIxMTE1NzE1MTkiLCANCiAgICAgICAgICAgICAgIjExMTU4NDU4OSIsICIxMTE1NjkxNTciLCAiMTExNTg2NjYwIiwNCiAgICAgICAgICAgICAgIjExMTU3NDA0MyIsICIxMTE1ODg3NDQiICAgICAgICAgICAgICApDQoNCiNnZW5lbGlzdCA8LSB1cHJlZ3VsYXRlZF9DUEZhbmRUM0lPUF9kZiRlbnRyZXpfSUQNCg0KI2Fubm90YXRpb25faW5mb1thbm5vdGF0aW9uX2luZm8kZW5zZW1ibF9JRCAlaW4lIGdlbmVsaXN0LGMoImVuc2VtYmxfSUQiLCAiZW50cmV6X0lEIildDQoNCg0KDQpzZWxlY3RlZF9nZW5lcyA8LSBjKGdlbmVsaXN0KQ0KDQoNCg0KI3RoZSBzdWJzZXQgYWJvdmUgd2FzIGNob3NlbiBiYXNlZCBvbiB0aGUgZW5zZW1ibGUgYW5ub3RhdGlvbi4gY29udmVydCB0byBOQ0JJDQojc2VsZWN0ZWRfZ2VuZXMgPC0gYW5ub3RhdGlvbl9pbmZvJGVudHJlel9JRFttYXRjaChzZWxlY3RlZF9nZW5lcywgYW5ub3RhdGlvbl9pbmZvJGVuc2VtYmxfSUQpXQ0KDQoNCmBgYA0KDQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KIyBSZXR1cm5zIHRoZSBtaXNzaW5nIGdlbmVzOg0KbWlzc2luZ19nZW5lcyA8LSBhcy5kYXRhLmZyYW1lKHNldGRpZmYoc2VsZWN0ZWRfZ2VuZXMsIHJvdy5uYW1lcyhjb3VudHNfVlNUKSkpIA0KY29sbmFtZXMobWlzc2luZ19nZW5lcykgPC0gImVudHJlel9JRCINCm1pc3NpbmdfZ2VuZXMkZGVzY3JpcHRpb24gPC0gYW5ub3RhdGlvbl9pbmZvJG1lcmdlZF9kZXNjcmlwdGlvblttYXRjaChtaXNzaW5nX2dlbmVzJGVudHJlel9JRCxhbm5vdGF0aW9uX2luZm8kZW50cmV6X0lEKV0NCiNubyBtaXNzaW5nIGdlbmVzDQoNCiMgUmV0dXJucyB0aGUgZXhpc3RpbmcgZ2VuZXM6DQpzZWxlY3RlZF9nZW5lcyA8LSBhcy5kYXRhLmZyYW1lKGludGVyc2VjdChzZWxlY3RlZF9nZW5lcywgcm93Lm5hbWVzKGNvdW50c19WU1QpKSkNCmNvbG5hbWVzKHNlbGVjdGVkX2dlbmVzKSA8LSAiZW50cmV6X0lEIg0Kc2VsZWN0ZWRfZ2VuZXMkZGVzY3JpcHRpb24gPC0gYW5ub3RhdGlvbl9pbmZvJG1lcmdlZF9kZXNjcmlwdGlvblttYXRjaChzZWxlY3RlZF9nZW5lcyRlbnRyZXpfSUQsYW5ub3RhdGlvbl9pbmZvJGVudHJlel9JRCldDQoNCiNwcmludCBsaXN0IG9mIGRpY2FyZGVkIGdlbmVzIChiZWNhdXNlIG1pc3NpbmcpIGFuZCBvZiByZXRhaW5lZCBnZW5lcyAoY3VyYXRlZCBkaWdlc3Rpb24gZ2VuZXMsIHByZXNlbnQgaW4gdGhlIGRhdGFzZXQpDQoNCiNrYWJsZShtaXNzaW5nX2dlbmVzLCBjYXB0aW9uID0gIkdlbmVzIG1pc3NpbmcgZnJvbSB0aGUgZGF0YXNldCAoaWdub3JlZCkiKQ0Ka2FibGUoc2VsZWN0ZWRfZ2VuZXMsIGNhcHRpb24gPSAiR2VuZXMgcHJlc2VudCBpbiB0aGUgZGF0YXNldCAocmV0YWluZWQpIikNCg0KIyMgc3Vic2V0IHRoZSBvcmlnaW5hbCBWU1Qgb2JqZWN0cyB0byBvbmx5IGtlZXAgc2VsZWN0ZWQgZ2VuZXMNCmNvdW50c19WU1Rfc2VsZWN0ZWRnZW5lcyA8LSBzdWJzZXQoY291bnRzX1ZTVCwgcm93bmFtZXMoY291bnRzX1ZTVCkgJWluJSBzZWxlY3RlZF9nZW5lcyRlbnRyZXpfSUQpDQpyb3duYW1lcyhjb3VudHNfVlNUX3NlbGVjdGVkZ2VuZXMpIDwtIGFubm90YXRpb25faW5mbyRtZXJnZWRfZGVzY3JpcHRpb25bbWF0Y2gocm93bmFtZXMoY291bnRzX1ZTVF9zZWxlY3RlZGdlbmVzKSwgYW5ub3RhdGlvbl9pbmZvJGVudHJlel9JRCldDQoNCiNyZW1vdmUgdW51c2VkIHZhcmlhYmxlcw0KI3JtKHNlbGVjdGVkX2dlbmVzKQ0KDQpgYGANCg0KYGBge3IsIGZpZy5oZWlnaHQ9NSwgZmlnLndpZHRoPTEwLCBlY2hvPUZBTFNFfQ0KDQojI2RlZmluZSB0aGUgY29sb3JzIGZvciB0aGUgaGVhdG1hcCAoY2F0ZWdvcmljYWwpOiAxIGNvbG9yIGZvciBlYWNoIHNtYWxsZXN0IGV4cGVyaW1lbnRhbCB1bml0IHRoYXQgaXMgYmVpbmcgIGNvbXBhcmVkOyBpLmUuIGhlcmUgdGhlIHRyZWF0bWVudA0KY29sb3JfY2F0ZWdvcmljYWxfaGVhdG1hcCA8LSBjb2xvcl9jYXRlZ29yaWNhbF90cmVhdG1lbnQNCiNuYW1lIHRoaXMgbGlzdCBvZiBjb2xvciB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIG5hbWVzIChub3RlOiB0aGVzZSBhcmUgdGhlIHVuaXF1ZSB2YWx1ZXMgZm9yIHRoYXQgY2F0ZWdvcnkgaW4gdGhlIHNhbXBsZSBtZXRhZGF0YSkNCmNvbG9yX2NhdGVnb3JpY2FsX2hlYXRtYXBfbmFtZWQgPC0gY29sb3JfY2F0ZWdvcmljYWxfaGVhdG1hcA0KbmFtZXMoY29sb3JfY2F0ZWdvcmljYWxfaGVhdG1hcF9uYW1lZCkgPC0gdW5pcXVlKHNhbXBsZV9tZXRhZGF0YSR0cmVhdG1lbnQpDQoNCiNsb2FkIHRoaXMgaW5mb3JtYXRpb24gaW50byB0aGUgaGVhdG1hcA0KY29sQW5uIDwtIEhlYXRtYXBBbm5vdGF0aW9uKCNkZiA9IGRhdGEuZnJhbWUodHJlYXRtZW50ID0gc2FtcGxlX21ldGFkYXRhJHRyZWF0bWVudCksICN0aGUgbmFtZSBvZiB0aGUgY29sdW1uIG5lZWRzIHRvIG1hdGNoIHRoZSBuYW1lIG9mIHRoZSBuYW1lZCBsaXN0DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgI2NvbCA9IGxpc3QoInRyZWF0bWVudCIgPSBjb2xvcl9jYXRlZ29yaWNhbF9oZWF0bWFwX25hbWVkKSwgI3NldCB0aGUgbmFtZSBvZiB0aGUgbmFtZWQgbGlzdCBzbyBpdCBtYXRjaGVzDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgI2Fubm90YXRpb25fd2lkdGggPSB1bml0KGMoMSwgNCksICdjbScpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICNnYXAgPSB1bml0KDEsICdtbScpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd19sZWdlbmQgPSBGQUxTRSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG93X2Fubm90YXRpb25fbmFtZSA9IEZBTFNFLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoID0gJ2NvbCcsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgI2Fsc28gY3JlYXRlIGFuIGVtcHR5IHJvdyBhYm9lIHRoZSBoZWF0bWFwLCB0byBkaXNwbGF5IGFkZGl0aW9uYWwgaW5mbw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtcHR5MSA9IGFubm9fZW1wdHkoYm9yZGVyID0gRkFMU0UsIGhlaWdodD0gdW5pdCg4LCAibW0iKSkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApDQoNCg0KSGVhdG1hcChtYXQgPSB0KHNjYWxlKHQoY291bnRzX1ZTVF9zZWxlY3RlZGdlbmVzKSkpLA0KICAgICAgICBuYW1lPSAiei1zY29yZSIsDQogICAgICAgIGNvbHVtbl90aXRsZSA9IGd0X3JlbmRlcigNCiAgICAgICAgICAiUGF0dGVybiBvZiBleHByZXNzaW9uIChhcyA8c3BhbiBzdHlsZT0nY29sb3I6YnJvd24yJz4qKnotc2NvcmVzKio8L3NwYW4+KSA8YnIvPiBvZiBIUFQgYXhpcyBnZW5lcyINCiAgICAgICAgICApLA0KICAgICAgICBjb2wgPSByZXYoYnJld2VyLnBhbCgxMSwiUmRCdSIpKSwNCiAgICAgICAgbmFfY29sID0gImJsYWNrIiwNCiAgICAgICAgY2x1c3Rlcl9yb3dzID0gVCwNCiAgICAgICAgc2hvd19yb3dfZGVuZCA9IFQsDQogICAgICAgICNyb3dfb3JkZXIgPSBvcmRlcmVkX2xldmVscywNCiAgICAgICAgY2x1c3Rlcl9jb2x1bW5zID0gRkFMU0UsDQogICAgICAgIHNob3dfY29sdW1uX2RlbmQgPSBGQUxTRSwNCiAgICAgICAgI2NvbHVtbl9vcmRlciA9IG9yZGVyZWRfbGV2ZWxzLA0KICAgICAgICAjcm93X3NwbGl0ID0gZmFjdG9yKHBhc3RlMChzYW1wbGVfbWV0YWRhdGEkc2VnbWVudCwgc2FtcGxlX21ldGFkYXRhJHN0YWdlKSwgbGV2ZWxzID0gYygibGl2ZXJTMSIsICJsaXZlclM0IiwgImxpdmVyUzciLCAic3RvbWFjaFMxIiwgImludGVzdGluZVMxIiwgInN0b21hY2hTNCIsICJBX2ludGVzdGluZVM0IiwgIlBfaW50ZXN0aW5lUzQiLCAic3RvbWFjaFM3IiwgIkFfaW50ZXN0aW5lUzciLCAiUF9pbnRlc3RpbmVTNyIpKSwNCiAgICAgICAgY29sdW1uX3NwbGl0ID0gZmFjdG9yKHNhbXBsZV9tZXRhZGF0YSR0cmVhdG1lbnQsIGxldmVscyA9IGMoIkRNU08iLCAiVDNJT1AiLCAiTVBJIiwgIkNQRiIsICJDUEYuVDNJT1AiKSksDQogICAgICAgICNjbHVzdGVyX3Jvd19zbGljZXMgPSBGQUxTRSwNCiAgICAgICAgY2x1c3Rlcl9jb2x1bW5fc2xpY2VzID0gRkFMU0UsDQogICAgICAgIHJvd190aXRsZSA9IE5VTEwsDQogICAgICAgIHJvd19nYXAgPSB1bml0KDAuNSwgIm1tIiksDQogICAgICAgIGNvbHVtbl9nYXAgPSB1bml0KGMocmVwKDEwLDEpLCByZXAoMiwzKSksICJtbSIpLA0KICAgICAgICAjd2lkdGggPSB1bml0KDgsICJjbSIpLCANCiAgICAgICAgI2hlaWdodCA9IHVuaXQoOCwgImNtIiksDQogICAgICAgIGNvbHVtbl9uYW1lc19ncCA9IGdyaWQ6OmdwYXIoZm9udHNpemUgPSA4KSwNCiAgICAgICAgcm93X25hbWVzX2dwID0gZ3JpZDo6Z3Bhcihmb250c2l6ZSA9IDgpLA0KICAgICAgICB0b3BfYW5ub3RhdGlvbiA9IGNvbEFubiwNCiAgICAgICAgI2xlZnRfYW5ub3RhdGlvbiA9IHJvd0FubiwNCiAgICAgICAgc2hvd19oZWF0bWFwX2xlZ2VuZCA9IEYsDQogICAgICAgIGJvcmRlciA9IFRSVUUsDQogICAgICAgIGNsdXN0ZXJpbmdfbWV0aG9kX3Jvd3MgPSAnd2FyZC5EMicNCiAgICAgICAgKQ0KDQoNCmxpYnJhcnkoR2V0b3B0TG9uZykgICMgZm9yIHRoZSBmdW5jdGlvbiBxcSgpDQpncm91cF9ibG9ja19hbm5vID0gZnVuY3Rpb24oZ3JvdXAsIGVtcHR5X2Fubm8sIGdwID0gZ3BhcigpLCANCiAgICBsYWJlbCA9IE5VTEwsIGxhYmVsX2dwID0gZ3BhcigpKSB7DQoNCiAgICBzZWVrVmlld3BvcnQocXEoImFubm90YXRpb25fQHtlbXB0eV9hbm5vfV9Ae21pbihncm91cCl9IikpDQogICAgbG9jMSA9IGRldmljZUxvYyh4ID0gdW5pdCgwLCAibnBjIiksIHkgPSB1bml0KDAsICJucGMiKSkNCiAgICBzZWVrVmlld3BvcnQocXEoImFubm90YXRpb25fQHtlbXB0eV9hbm5vfV9Ae21heChncm91cCl9IikpDQogICAgbG9jMiA9IGRldmljZUxvYyh4ID0gdW5pdCgxLCAibnBjIiksIHkgPSB1bml0KDEsICJucGMiKSkNCg0KICAgIHNlZWtWaWV3cG9ydCgiZ2xvYmFsIikNCiAgICBncmlkLnJlY3QobG9jMSR4LCBsb2MxJHksIHdpZHRoID0gbG9jMiR4IC0gbG9jMSR4LCBoZWlnaHQgPSBsb2MyJHkgLSBsb2MxJHksIA0KICAgICAgICBqdXN0ID0gYygibGVmdCIsICJib3R0b20iKSwgZ3AgPSBncCkNCiAgICBpZighaXMubnVsbChsYWJlbCkpIHsNCiAgICAgICAgZ3JpZC50ZXh0KGxhYmVsLCB4ID0gKGxvYzEkeCArIGxvYzIkeCkqMC41LCB5ID0gKGxvYzEkeSArIGxvYzIkeSkqMC41LCBncCA9IGxhYmVsX2dwKQ0KICAgIH0NCn0NCg0KZ3JvdXBfYmxvY2tfYW5ubygxOjEsICJlbXB0eTEiLCBncCA9IGdwYXIoZmlsbCA9ICJncmF5NzAiKSwgbGFiZWwgPSAiRE1TTyIpDQpncm91cF9ibG9ja19hbm5vKDI6MiwgImVtcHR5MSIsIGdwID0gZ3BhcihmaWxsID0gInBhbGVncmVlbjMiKSwgbGFiZWwgPSAiVDMrSU9QIikNCmdyb3VwX2Jsb2NrX2Fubm8oMzozLCAiZW1wdHkxIiwgZ3AgPSBncGFyKGZpbGwgPSAibGlnaHRjb3JhbCIpLCBsYWJlbCA9ICJNUEkiKQ0KZ3JvdXBfYmxvY2tfYW5ubyg0OjQsICJlbXB0eTEiLCBncCA9IGdwYXIoZmlsbCA9ICJsaWdodHNreWJsdWUiKSwgbGFiZWwgPSAiQ1BGIikNCmdyb3VwX2Jsb2NrX2Fubm8oNTo1LCAiZW1wdHkxIiwgZ3AgPSBncGFyKGZpbGwgPSAib3JjaGlkMiIpLCBsYWJlbCA9ICJDUEYrVDMrSU9QIikNCg0KDQpgYGANCg0KIyMjIyMgRE9XTiBDUEYgYW5kIE1QSSAoc2VsZWN0ZWQpDQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KI2xvYWQgdGhlIGNvdW50c19WU1Qgb2JqZWN0DQpsb2FkKCJEOi8vQW9jZWxsYXJpc19DUEZfTVBJX1QzL1NhdmVkX29iamVjdHMvY291bnRzX1ZTVC5yZHMiKQ0KbG9hZCgiRDovL0FvY2VsbGFyaXNfQ1BGX01QSV9UMy9TYXZlZF9vYmplY3RzL3NhbXBsZV9tZXRhZGF0YS5yZHMiKQ0KYGBgDQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KI2xvYWQgbGlzdCBvZiBnZW5lcw0KZG93bnJlZ3VsYXRlZF9DUEZhbmRNUElfZGYgPC0gcmVhZC5jc3YoZmlsZT0iRDovL0FvY2VsbGFyaXNfQ1BGX01QSV9UMy9TYXZlZF9vYmplY3RzL1Zlbm4vZG93bnJlZ3VsYXRlZF9DUEZhbmRNUElfY2xlYW4uY3N2IikNCg0KI2xvYWQgZGlmZmVyZW50aWFsbHkgZXhwcmVzc2VkIGdlbmVzIGJldHdlZW4gUzEgYW5kIFM3LCByYW5rZWQgYnkgRkMNCkRFX2dlbmVzIDwtIHVwcmVndWxhdGVkX0NQRmFuZFQzSU9QX2RmJGVuc2VtYmxfSURfQ1BGDQoNCiNzZWxlY3QgZ2VuZXMNCg0KZ2VuZWxpc3QgPC0gYygiMTExNTc0ODE4IiwgIjExMTU4MjQwMCIsICIxMTE1NzAxNTUiLA0KICAgICAgICAgICAgICAiMTExNTg1Njg0IiwNCiAgICAgICAgICAgICAgIjExMTU4MTA1MyIsICIxMTE1ODI0MDkiLCAiMTExNTc5NzM5Ig0KICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgKQ0KDQoNCg0KI2Fubm90YXRpb25faW5mb1thbm5vdGF0aW9uX2luZm8kZW5zZW1ibF9JRCAlaW4lIGdlbmVsaXN0LGMoImVuc2VtYmxfSUQiLCAiZW50cmV6X0lEIildDQoNCg0KDQpzZWxlY3RlZF9nZW5lcyA8LSBjKGdlbmVsaXN0KQ0KDQoNCg0KI3RoZSBzdWJzZXQgYWJvdmUgd2FzIGNob3NlbiBiYXNlZCBvbiB0aGUgZW5zZW1ibGUgYW5ub3RhdGlvbi4gY29udmVydCB0byBOQ0JJDQojc2VsZWN0ZWRfZ2VuZXMgPC0gYW5ub3RhdGlvbl9pbmZvJGVudHJlel9JRFttYXRjaChzZWxlY3RlZF9nZW5lcywgYW5ub3RhdGlvbl9pbmZvJGVuc2VtYmxfSUQpXQ0KDQoNCmBgYA0KDQpgYGB7ciwgZWNobz1GQUxTRX0NCiMgUmV0dXJucyB0aGUgbWlzc2luZyBnZW5lczoNCm1pc3NpbmdfZ2VuZXMgPC0gYXMuZGF0YS5mcmFtZShzZXRkaWZmKHNlbGVjdGVkX2dlbmVzLCByb3cubmFtZXMoY291bnRzX1ZTVCkpKSANCmNvbG5hbWVzKG1pc3NpbmdfZ2VuZXMpIDwtICJlbnRyZXpfSUQiDQptaXNzaW5nX2dlbmVzJGRlc2NyaXB0aW9uIDwtIGFubm90YXRpb25faW5mbyRtZXJnZWRfZGVzY3JpcHRpb25bbWF0Y2gobWlzc2luZ19nZW5lcyRlbnRyZXpfSUQsYW5ub3RhdGlvbl9pbmZvJGVudHJlel9JRCldDQojbm8gbWlzc2luZyBnZW5lcw0KDQojIFJldHVybnMgdGhlIGV4aXN0aW5nIGdlbmVzOg0Kc2VsZWN0ZWRfZ2VuZXMgPC0gYXMuZGF0YS5mcmFtZShpbnRlcnNlY3Qoc2VsZWN0ZWRfZ2VuZXMsIHJvdy5uYW1lcyhjb3VudHNfVlNUKSkpDQpjb2xuYW1lcyhzZWxlY3RlZF9nZW5lcykgPC0gImVudHJlel9JRCINCnNlbGVjdGVkX2dlbmVzJGRlc2NyaXB0aW9uIDwtIGFubm90YXRpb25faW5mbyRtZXJnZWRfZGVzY3JpcHRpb25bbWF0Y2goc2VsZWN0ZWRfZ2VuZXMkZW50cmV6X0lELGFubm90YXRpb25faW5mbyRlbnRyZXpfSUQpXQ0KDQojcHJpbnQgbGlzdCBvZiBkaWNhcmRlZCBnZW5lcyAoYmVjYXVzZSBtaXNzaW5nKSBhbmQgb2YgcmV0YWluZWQgZ2VuZXMgKGN1cmF0ZWQgZGlnZXN0aW9uIGdlbmVzLCBwcmVzZW50IGluIHRoZSBkYXRhc2V0KQ0KDQoja2FibGUobWlzc2luZ19nZW5lcywgY2FwdGlvbiA9ICJHZW5lcyBtaXNzaW5nIGZyb20gdGhlIGRhdGFzZXQgKGlnbm9yZWQpIikNCmthYmxlKHNlbGVjdGVkX2dlbmVzLCBjYXB0aW9uID0gIkdlbmVzIHByZXNlbnQgaW4gdGhlIGRhdGFzZXQgKHJldGFpbmVkKSIpDQoNCiMjIHN1YnNldCB0aGUgb3JpZ2luYWwgVlNUIG9iamVjdHMgdG8gb25seSBrZWVwIHNlbGVjdGVkIGdlbmVzDQpjb3VudHNfVlNUX3NlbGVjdGVkZ2VuZXMgPC0gc3Vic2V0KGNvdW50c19WU1QsIHJvd25hbWVzKGNvdW50c19WU1QpICVpbiUgc2VsZWN0ZWRfZ2VuZXMkZW50cmV6X0lEKQ0Kcm93bmFtZXMoY291bnRzX1ZTVF9zZWxlY3RlZGdlbmVzKSA8LSBhbm5vdGF0aW9uX2luZm8kbWVyZ2VkX2Rlc2NyaXB0aW9uW21hdGNoKHJvd25hbWVzKGNvdW50c19WU1Rfc2VsZWN0ZWRnZW5lcyksIGFubm90YXRpb25faW5mbyRlbnRyZXpfSUQpXQ0KDQojcmVtb3ZlIHVudXNlZCB2YXJpYWJsZXMNCiNybShzZWxlY3RlZF9nZW5lcykNCg0KYGBgDQoNCmBgYHtyLCBmaWcuaGVpZ2h0PTMsIGZpZy53aWR0aD0xMCwgZWNobz1GQUxTRX0NCg0KIyNkZWZpbmUgdGhlIGNvbG9ycyBmb3IgdGhlIGhlYXRtYXAgKGNhdGVnb3JpY2FsKTogMSBjb2xvciBmb3IgZWFjaCBzbWFsbGVzdCBleHBlcmltZW50YWwgdW5pdCB0aGF0IGlzIGJlaW5nICBjb21wYXJlZDsgaS5lLiBoZXJlIHRoZSB0cmVhdG1lbnQNCmNvbG9yX2NhdGVnb3JpY2FsX2hlYXRtYXAgPC0gY29sb3JfY2F0ZWdvcmljYWxfdHJlYXRtZW50DQojbmFtZSB0aGlzIGxpc3Qgb2YgY29sb3Igd2l0aCB0aGUgY29ycmVzcG9uZGluZyBuYW1lcyAobm90ZTogdGhlc2UgYXJlIHRoZSB1bmlxdWUgdmFsdWVzIGZvciB0aGF0IGNhdGVnb3J5IGluIHRoZSBzYW1wbGUgbWV0YWRhdGEpDQpjb2xvcl9jYXRlZ29yaWNhbF9oZWF0bWFwX25hbWVkIDwtIGNvbG9yX2NhdGVnb3JpY2FsX2hlYXRtYXANCm5hbWVzKGNvbG9yX2NhdGVnb3JpY2FsX2hlYXRtYXBfbmFtZWQpIDwtIHVuaXF1ZShzYW1wbGVfbWV0YWRhdGEkdHJlYXRtZW50KQ0KDQojbG9hZCB0aGlzIGluZm9ybWF0aW9uIGludG8gdGhlIGhlYXRtYXANCmNvbEFubiA8LSBIZWF0bWFwQW5ub3RhdGlvbigjZGYgPSBkYXRhLmZyYW1lKHRyZWF0bWVudCA9IHNhbXBsZV9tZXRhZGF0YSR0cmVhdG1lbnQpLCAjdGhlIG5hbWUgb2YgdGhlIGNvbHVtbiBuZWVkcyB0byBtYXRjaCB0aGUgbmFtZSBvZiB0aGUgbmFtZWQgbGlzdA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICNjb2wgPSBsaXN0KCJ0cmVhdG1lbnQiID0gY29sb3JfY2F0ZWdvcmljYWxfaGVhdG1hcF9uYW1lZCksICNzZXQgdGhlIG5hbWUgb2YgdGhlIG5hbWVkIGxpc3Qgc28gaXQgbWF0Y2hlcw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICNhbm5vdGF0aW9uX3dpZHRoID0gdW5pdChjKDEsIDQpLCAnY20nKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjZ2FwID0gdW5pdCgxLCAnbW0nKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3dfbGVnZW5kID0gRkFMU0UsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd19hbm5vdGF0aW9uX25hbWUgPSBGQUxTRSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGljaCA9ICdjb2wnLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICNhbHNvIGNyZWF0ZSBhbiBlbXB0eSByb3cgYWJvZSB0aGUgaGVhdG1hcCwgdG8gZGlzcGxheSBhZGRpdGlvbmFsIGluZm8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbXB0eTEgPSBhbm5vX2VtcHR5KGJvcmRlciA9IEZBTFNFLCBoZWlnaHQ9IHVuaXQoOCwgIm1tIikpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKQ0KDQoNCkhlYXRtYXAobWF0ID0gdChzY2FsZSh0KGNvdW50c19WU1Rfc2VsZWN0ZWRnZW5lcykpKSwNCiAgICAgICAgbmFtZT0gInotc2NvcmUiLA0KICAgICAgICBjb2x1bW5fdGl0bGUgPSBndF9yZW5kZXIoDQogICAgICAgICAgIlBhdHRlcm4gb2YgZXhwcmVzc2lvbiAoYXMgPHNwYW4gc3R5bGU9J2NvbG9yOmJyb3duMic+Kip6LXNjb3JlcyoqPC9zcGFuPikgPGJyLz4gb2YgSFBUIGF4aXMgZ2VuZXMiDQogICAgICAgICAgKSwNCiAgICAgICAgY29sID0gcmV2KGJyZXdlci5wYWwoMTEsIlJkQnUiKSksDQogICAgICAgIG5hX2NvbCA9ICJibGFjayIsDQogICAgICAgIGNsdXN0ZXJfcm93cyA9IFQsDQogICAgICAgIHNob3dfcm93X2RlbmQgPSBULA0KICAgICAgICAjcm93X29yZGVyID0gb3JkZXJlZF9sZXZlbHMsDQogICAgICAgIGNsdXN0ZXJfY29sdW1ucyA9IEZBTFNFLA0KICAgICAgICBzaG93X2NvbHVtbl9kZW5kID0gRkFMU0UsDQogICAgICAgICNjb2x1bW5fb3JkZXIgPSBvcmRlcmVkX2xldmVscywNCiAgICAgICAgI3Jvd19zcGxpdCA9IGZhY3RvcihwYXN0ZTAoc2FtcGxlX21ldGFkYXRhJHNlZ21lbnQsIHNhbXBsZV9tZXRhZGF0YSRzdGFnZSksIGxldmVscyA9IGMoImxpdmVyUzEiLCAibGl2ZXJTNCIsICJsaXZlclM3IiwgInN0b21hY2hTMSIsICJpbnRlc3RpbmVTMSIsICJzdG9tYWNoUzQiLCAiQV9pbnRlc3RpbmVTNCIsICJQX2ludGVzdGluZVM0IiwgInN0b21hY2hTNyIsICJBX2ludGVzdGluZVM3IiwgIlBfaW50ZXN0aW5lUzciKSksDQogICAgICAgIGNvbHVtbl9zcGxpdCA9IGZhY3RvcihzYW1wbGVfbWV0YWRhdGEkdHJlYXRtZW50LCBsZXZlbHMgPSBjKCJETVNPIiwgIlQzSU9QIiwgIk1QSSIsICJDUEYiLCAiQ1BGLlQzSU9QIikpLA0KICAgICAgICAjY2x1c3Rlcl9yb3dfc2xpY2VzID0gRkFMU0UsDQogICAgICAgIGNsdXN0ZXJfY29sdW1uX3NsaWNlcyA9IEZBTFNFLA0KICAgICAgICByb3dfdGl0bGUgPSBOVUxMLA0KICAgICAgICByb3dfZ2FwID0gdW5pdCgwLjUsICJtbSIpLA0KICAgICAgICBjb2x1bW5fZ2FwID0gdW5pdChjKHJlcCgxMCwxKSwgcmVwKDIsMykpLCAibW0iKSwNCiAgICAgICAgI3dpZHRoID0gdW5pdCg4LCAiY20iKSwgDQogICAgICAgICNoZWlnaHQgPSB1bml0KDgsICJjbSIpLA0KICAgICAgICBjb2x1bW5fbmFtZXNfZ3AgPSBncmlkOjpncGFyKGZvbnRzaXplID0gOCksDQogICAgICAgIHJvd19uYW1lc19ncCA9IGdyaWQ6OmdwYXIoZm9udHNpemUgPSA4KSwNCiAgICAgICAgdG9wX2Fubm90YXRpb24gPSBjb2xBbm4sDQogICAgICAgICNsZWZ0X2Fubm90YXRpb24gPSByb3dBbm4sDQogICAgICAgIHNob3dfaGVhdG1hcF9sZWdlbmQgPSBGLA0KICAgICAgICBib3JkZXIgPSBUUlVFLA0KICAgICAgICBjbHVzdGVyaW5nX21ldGhvZF9yb3dzID0gJ3dhcmQuRDInDQogICAgICAgICkNCg0KDQpsaWJyYXJ5KEdldG9wdExvbmcpICAjIGZvciB0aGUgZnVuY3Rpb24gcXEoKQ0KZ3JvdXBfYmxvY2tfYW5ubyA9IGZ1bmN0aW9uKGdyb3VwLCBlbXB0eV9hbm5vLCBncCA9IGdwYXIoKSwgDQogICAgbGFiZWwgPSBOVUxMLCBsYWJlbF9ncCA9IGdwYXIoKSkgew0KDQogICAgc2Vla1ZpZXdwb3J0KHFxKCJhbm5vdGF0aW9uX0B7ZW1wdHlfYW5ub31fQHttaW4oZ3JvdXApfSIpKQ0KICAgIGxvYzEgPSBkZXZpY2VMb2MoeCA9IHVuaXQoMCwgIm5wYyIpLCB5ID0gdW5pdCgwLCAibnBjIikpDQogICAgc2Vla1ZpZXdwb3J0KHFxKCJhbm5vdGF0aW9uX0B7ZW1wdHlfYW5ub31fQHttYXgoZ3JvdXApfSIpKQ0KICAgIGxvYzIgPSBkZXZpY2VMb2MoeCA9IHVuaXQoMSwgIm5wYyIpLCB5ID0gdW5pdCgxLCAibnBjIikpDQoNCiAgICBzZWVrVmlld3BvcnQoImdsb2JhbCIpDQogICAgZ3JpZC5yZWN0KGxvYzEkeCwgbG9jMSR5LCB3aWR0aCA9IGxvYzIkeCAtIGxvYzEkeCwgaGVpZ2h0ID0gbG9jMiR5IC0gbG9jMSR5LCANCiAgICAgICAganVzdCA9IGMoImxlZnQiLCAiYm90dG9tIiksIGdwID0gZ3ApDQogICAgaWYoIWlzLm51bGwobGFiZWwpKSB7DQogICAgICAgIGdyaWQudGV4dChsYWJlbCwgeCA9IChsb2MxJHggKyBsb2MyJHgpKjAuNSwgeSA9IChsb2MxJHkgKyBsb2MyJHkpKjAuNSwgZ3AgPSBsYWJlbF9ncCkNCiAgICB9DQp9DQoNCmdyb3VwX2Jsb2NrX2Fubm8oMToxLCAiZW1wdHkxIiwgZ3AgPSBncGFyKGZpbGwgPSAiZ3JheTcwIiksIGxhYmVsID0gIkRNU08iKQ0KZ3JvdXBfYmxvY2tfYW5ubygyOjIsICJlbXB0eTEiLCBncCA9IGdwYXIoZmlsbCA9ICJwYWxlZ3JlZW4zIiksIGxhYmVsID0gIlQzK0lPUCIpDQpncm91cF9ibG9ja19hbm5vKDM6MywgImVtcHR5MSIsIGdwID0gZ3BhcihmaWxsID0gImxpZ2h0Y29yYWwiKSwgbGFiZWwgPSAiTVBJIikNCmdyb3VwX2Jsb2NrX2Fubm8oNDo0LCAiZW1wdHkxIiwgZ3AgPSBncGFyKGZpbGwgPSAibGlnaHRza3libHVlIiksIGxhYmVsID0gIkNQRiIpDQpncm91cF9ibG9ja19hbm5vKDU6NSwgImVtcHR5MSIsIGdwID0gZ3BhcihmaWxsID0gIm9yY2hpZDIiKSwgbGFiZWwgPSAiQ1BGK1QzK0lPUCIpDQoNCg0KYGBgDQoNCiMjIyMjIERPV04gQ1BGIGFuZCBUMyAoc2VsZWN0ZWQpDQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KI2xvYWQgdGhlIGNvdW50c19WU1Qgb2JqZWN0DQpsb2FkKCJEOi8vQW9jZWxsYXJpc19DUEZfTVBJX1QzL1NhdmVkX29iamVjdHMvY291bnRzX1ZTVC5yZHMiKQ0KbG9hZCgiRDovL0FvY2VsbGFyaXNfQ1BGX01QSV9UMy9TYXZlZF9vYmplY3RzL3NhbXBsZV9tZXRhZGF0YS5yZHMiKQ0KYGBgDQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KI2xvYWQgbGlzdCBvZiBnZW5lcw0KZG93bnJlZ3VsYXRlZF9DUEZhbmRUM19kZiA8LSByZWFkLmNzdihmaWxlPSJEOi8vQW9jZWxsYXJpc19DUEZfTVBJX1QzL1NhdmVkX29iamVjdHMvVmVubi9kb3ducmVndWxhdGVkX0NQRmFuZFQzSU9QX2NsZWFuLmNzdiIpDQoNCiNsb2FkIGRpZmZlcmVudGlhbGx5IGV4cHJlc3NlZCBnZW5lcyBiZXR3ZWVuIFMxIGFuZCBTNywgcmFua2VkIGJ5IEZDDQpERV9nZW5lcyA8LSB1cHJlZ3VsYXRlZF9DUEZhbmRUM0lPUF9kZiRlbnNlbWJsX0lEX0NQRg0KDQojc2VsZWN0IGdlbmVzDQoNCmdlbmVsaXN0IDwtIGMoIjExMTU3NDgxMiIsICIxMTE1NzQ4MTMiLCAiMTExNTc0ODE0IiwgIjExMTU3NDgxMSIsDQogICAgICAgICAgICAgICIxMTE1NjY0NDIiLCAiMTExNTY2NDMyIiwgIjExMTU2NDkyNSIsICIxMTE1NzA4MjEiLCAiMTExNTY2NDc5IiwgIjExMTU4ODM3OSIsIjExMTU2NjQ3OSIsICIxMTE1NzE3NjAiLCAiMTExNTY0ODAwIiAgICAgICAgICAgICAgKQ0KDQoNCg0KI2Fubm90YXRpb25faW5mb1thbm5vdGF0aW9uX2luZm8kZW5zZW1ibF9JRCAlaW4lIGdlbmVsaXN0LGMoImVuc2VtYmxfSUQiLCAiZW50cmV6X0lEIildDQoNCg0KDQpzZWxlY3RlZF9nZW5lcyA8LSBjKGdlbmVsaXN0KQ0KDQoNCg0KI3RoZSBzdWJzZXQgYWJvdmUgd2FzIGNob3NlbiBiYXNlZCBvbiB0aGUgZW5zZW1ibGUgYW5ub3RhdGlvbi4gY29udmVydCB0byBOQ0JJDQojc2VsZWN0ZWRfZ2VuZXMgPC0gYW5ub3RhdGlvbl9pbmZvJGVudHJlel9JRFttYXRjaChzZWxlY3RlZF9nZW5lcywgYW5ub3RhdGlvbl9pbmZvJGVuc2VtYmxfSUQpXQ0KDQoNCmBgYA0KDQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KIyBSZXR1cm5zIHRoZSBtaXNzaW5nIGdlbmVzOg0KbWlzc2luZ19nZW5lcyA8LSBhcy5kYXRhLmZyYW1lKHNldGRpZmYoc2VsZWN0ZWRfZ2VuZXMsIHJvdy5uYW1lcyhjb3VudHNfVlNUKSkpIA0KY29sbmFtZXMobWlzc2luZ19nZW5lcykgPC0gImVudHJlel9JRCINCm1pc3NpbmdfZ2VuZXMkZGVzY3JpcHRpb24gPC0gYW5ub3RhdGlvbl9pbmZvJG1lcmdlZF9kZXNjcmlwdGlvblttYXRjaChtaXNzaW5nX2dlbmVzJGVudHJlel9JRCxhbm5vdGF0aW9uX2luZm8kZW50cmV6X0lEKV0NCiNubyBtaXNzaW5nIGdlbmVzDQoNCiMgUmV0dXJucyB0aGUgZXhpc3RpbmcgZ2VuZXM6DQpzZWxlY3RlZF9nZW5lcyA8LSBhcy5kYXRhLmZyYW1lKGludGVyc2VjdChzZWxlY3RlZF9nZW5lcywgcm93Lm5hbWVzKGNvdW50c19WU1QpKSkNCmNvbG5hbWVzKHNlbGVjdGVkX2dlbmVzKSA8LSAiZW50cmV6X0lEIg0Kc2VsZWN0ZWRfZ2VuZXMkZGVzY3JpcHRpb24gPC0gYW5ub3RhdGlvbl9pbmZvJG1lcmdlZF9kZXNjcmlwdGlvblttYXRjaChzZWxlY3RlZF9nZW5lcyRlbnRyZXpfSUQsYW5ub3RhdGlvbl9pbmZvJGVudHJlel9JRCldDQoNCiNwcmludCBsaXN0IG9mIGRpY2FyZGVkIGdlbmVzIChiZWNhdXNlIG1pc3NpbmcpIGFuZCBvZiByZXRhaW5lZCBnZW5lcyAoY3VyYXRlZCBkaWdlc3Rpb24gZ2VuZXMsIHByZXNlbnQgaW4gdGhlIGRhdGFzZXQpDQoNCiNrYWJsZShtaXNzaW5nX2dlbmVzLCBjYXB0aW9uID0gIkdlbmVzIG1pc3NpbmcgZnJvbSB0aGUgZGF0YXNldCAoaWdub3JlZCkiKQ0Ka2FibGUoc2VsZWN0ZWRfZ2VuZXMsIGNhcHRpb24gPSAiR2VuZXMgcHJlc2VudCBpbiB0aGUgZGF0YXNldCAocmV0YWluZWQpIikNCg0KIyMgc3Vic2V0IHRoZSBvcmlnaW5hbCBWU1Qgb2JqZWN0cyB0byBvbmx5IGtlZXAgc2VsZWN0ZWQgZ2VuZXMNCmNvdW50c19WU1Rfc2VsZWN0ZWRnZW5lcyA8LSBzdWJzZXQoY291bnRzX1ZTVCwgcm93bmFtZXMoY291bnRzX1ZTVCkgJWluJSBzZWxlY3RlZF9nZW5lcyRlbnRyZXpfSUQpDQpyb3duYW1lcyhjb3VudHNfVlNUX3NlbGVjdGVkZ2VuZXMpIDwtIGFubm90YXRpb25faW5mbyRtZXJnZWRfZGVzY3JpcHRpb25bbWF0Y2gocm93bmFtZXMoY291bnRzX1ZTVF9zZWxlY3RlZGdlbmVzKSwgYW5ub3RhdGlvbl9pbmZvJGVudHJlel9JRCldDQoNCiNyZW1vdmUgdW51c2VkIHZhcmlhYmxlcw0KI3JtKHNlbGVjdGVkX2dlbmVzKQ0KDQpgYGANCg0KYGBge3IsIGZpZy5oZWlnaHQ9My41LCBmaWcud2lkdGg9MTAsIGVjaG89RkFMU0V9DQoNCiMjZGVmaW5lIHRoZSBjb2xvcnMgZm9yIHRoZSBoZWF0bWFwIChjYXRlZ29yaWNhbCk6IDEgY29sb3IgZm9yIGVhY2ggc21hbGxlc3QgZXhwZXJpbWVudGFsIHVuaXQgdGhhdCBpcyBiZWluZyAgY29tcGFyZWQ7IGkuZS4gaGVyZSB0aGUgdHJlYXRtZW50DQpjb2xvcl9jYXRlZ29yaWNhbF9oZWF0bWFwIDwtIGNvbG9yX2NhdGVnb3JpY2FsX3RyZWF0bWVudA0KI25hbWUgdGhpcyBsaXN0IG9mIGNvbG9yIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgbmFtZXMgKG5vdGU6IHRoZXNlIGFyZSB0aGUgdW5pcXVlIHZhbHVlcyBmb3IgdGhhdCBjYXRlZ29yeSBpbiB0aGUgc2FtcGxlIG1ldGFkYXRhKQ0KY29sb3JfY2F0ZWdvcmljYWxfaGVhdG1hcF9uYW1lZCA8LSBjb2xvcl9jYXRlZ29yaWNhbF9oZWF0bWFwDQpuYW1lcyhjb2xvcl9jYXRlZ29yaWNhbF9oZWF0bWFwX25hbWVkKSA8LSB1bmlxdWUoc2FtcGxlX21ldGFkYXRhJHRyZWF0bWVudCkNCg0KI2xvYWQgdGhpcyBpbmZvcm1hdGlvbiBpbnRvIHRoZSBoZWF0bWFwDQpjb2xBbm4gPC0gSGVhdG1hcEFubm90YXRpb24oI2RmID0gZGF0YS5mcmFtZSh0cmVhdG1lbnQgPSBzYW1wbGVfbWV0YWRhdGEkdHJlYXRtZW50KSwgI3RoZSBuYW1lIG9mIHRoZSBjb2x1bW4gbmVlZHMgdG8gbWF0Y2ggdGhlIG5hbWUgb2YgdGhlIG5hbWVkIGxpc3QNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjY29sID0gbGlzdCgidHJlYXRtZW50IiA9IGNvbG9yX2NhdGVnb3JpY2FsX2hlYXRtYXBfbmFtZWQpLCAjc2V0IHRoZSBuYW1lIG9mIHRoZSBuYW1lZCBsaXN0IHNvIGl0IG1hdGNoZXMNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjYW5ub3RhdGlvbl93aWR0aCA9IHVuaXQoYygxLCA0KSwgJ2NtJyksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgI2dhcCA9IHVuaXQoMSwgJ21tJykNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG93X2xlZ2VuZCA9IEZBTFNFLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3dfYW5ub3RhdGlvbl9uYW1lID0gRkFMU0UsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2ggPSAnY29sJywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjYWxzbyBjcmVhdGUgYW4gZW1wdHkgcm93IGFib2UgdGhlIGhlYXRtYXAsIHRvIGRpc3BsYXkgYWRkaXRpb25hbCBpbmZvDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1wdHkxID0gYW5ub19lbXB0eShib3JkZXIgPSBGQUxTRSwgaGVpZ2h0PSB1bml0KDgsICJtbSIpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICkNCg0KDQpIZWF0bWFwKG1hdCA9IHQoc2NhbGUodChjb3VudHNfVlNUX3NlbGVjdGVkZ2VuZXMpKSksDQogICAgICAgIG5hbWU9ICJ6LXNjb3JlIiwNCiAgICAgICAgY29sdW1uX3RpdGxlID0gZ3RfcmVuZGVyKA0KICAgICAgICAgICJQYXR0ZXJuIG9mIGV4cHJlc3Npb24gKGFzIDxzcGFuIHN0eWxlPSdjb2xvcjpicm93bjInPioqei1zY29yZXMqKjwvc3Bhbj4pIDxici8+IG9mIEhQVCBheGlzIGdlbmVzIg0KICAgICAgICAgICksDQogICAgICAgIGNvbCA9IHJldihicmV3ZXIucGFsKDExLCJSZEJ1IikpLA0KICAgICAgICBuYV9jb2wgPSAiYmxhY2siLA0KICAgICAgICBjbHVzdGVyX3Jvd3MgPSBULA0KICAgICAgICBzaG93X3Jvd19kZW5kID0gVCwNCiAgICAgICAgI3Jvd19vcmRlciA9IG9yZGVyZWRfbGV2ZWxzLA0KICAgICAgICBjbHVzdGVyX2NvbHVtbnMgPSBGQUxTRSwNCiAgICAgICAgc2hvd19jb2x1bW5fZGVuZCA9IEZBTFNFLA0KICAgICAgICAjY29sdW1uX29yZGVyID0gb3JkZXJlZF9sZXZlbHMsDQogICAgICAgICNyb3dfc3BsaXQgPSBmYWN0b3IocGFzdGUwKHNhbXBsZV9tZXRhZGF0YSRzZWdtZW50LCBzYW1wbGVfbWV0YWRhdGEkc3RhZ2UpLCBsZXZlbHMgPSBjKCJsaXZlclMxIiwgImxpdmVyUzQiLCAibGl2ZXJTNyIsICJzdG9tYWNoUzEiLCAiaW50ZXN0aW5lUzEiLCAic3RvbWFjaFM0IiwgIkFfaW50ZXN0aW5lUzQiLCAiUF9pbnRlc3RpbmVTNCIsICJzdG9tYWNoUzciLCAiQV9pbnRlc3RpbmVTNyIsICJQX2ludGVzdGluZVM3IikpLA0KICAgICAgICBjb2x1bW5fc3BsaXQgPSBmYWN0b3Ioc2FtcGxlX21ldGFkYXRhJHRyZWF0bWVudCwgbGV2ZWxzID0gYygiRE1TTyIsICJUM0lPUCIsICJNUEkiLCAiQ1BGIiwgIkNQRi5UM0lPUCIpKSwNCiAgICAgICAgI2NsdXN0ZXJfcm93X3NsaWNlcyA9IEZBTFNFLA0KICAgICAgICBjbHVzdGVyX2NvbHVtbl9zbGljZXMgPSBGQUxTRSwNCiAgICAgICAgcm93X3RpdGxlID0gTlVMTCwNCiAgICAgICAgcm93X2dhcCA9IHVuaXQoMC41LCAibW0iKSwNCiAgICAgICAgY29sdW1uX2dhcCA9IHVuaXQoYyhyZXAoMTAsMSksIHJlcCgyLDMpKSwgIm1tIiksDQogICAgICAgICN3aWR0aCA9IHVuaXQoOCwgImNtIiksIA0KICAgICAgICAjaGVpZ2h0ID0gdW5pdCg4LCAiY20iKSwNCiAgICAgICAgY29sdW1uX25hbWVzX2dwID0gZ3JpZDo6Z3Bhcihmb250c2l6ZSA9IDgpLA0KICAgICAgICByb3dfbmFtZXNfZ3AgPSBncmlkOjpncGFyKGZvbnRzaXplID0gOCksDQogICAgICAgIHRvcF9hbm5vdGF0aW9uID0gY29sQW5uLA0KICAgICAgICAjbGVmdF9hbm5vdGF0aW9uID0gcm93QW5uLA0KICAgICAgICBzaG93X2hlYXRtYXBfbGVnZW5kID0gRiwNCiAgICAgICAgYm9yZGVyID0gVFJVRSwNCiAgICAgICAgY2x1c3RlcmluZ19tZXRob2Rfcm93cyA9ICd3YXJkLkQyJw0KICAgICAgICApDQoNCg0KbGlicmFyeShHZXRvcHRMb25nKSAgIyBmb3IgdGhlIGZ1bmN0aW9uIHFxKCkNCmdyb3VwX2Jsb2NrX2Fubm8gPSBmdW5jdGlvbihncm91cCwgZW1wdHlfYW5ubywgZ3AgPSBncGFyKCksIA0KICAgIGxhYmVsID0gTlVMTCwgbGFiZWxfZ3AgPSBncGFyKCkpIHsNCg0KICAgIHNlZWtWaWV3cG9ydChxcSgiYW5ub3RhdGlvbl9Ae2VtcHR5X2Fubm99X0B7bWluKGdyb3VwKX0iKSkNCiAgICBsb2MxID0gZGV2aWNlTG9jKHggPSB1bml0KDAsICJucGMiKSwgeSA9IHVuaXQoMCwgIm5wYyIpKQ0KICAgIHNlZWtWaWV3cG9ydChxcSgiYW5ub3RhdGlvbl9Ae2VtcHR5X2Fubm99X0B7bWF4KGdyb3VwKX0iKSkNCiAgICBsb2MyID0gZGV2aWNlTG9jKHggPSB1bml0KDEsICJucGMiKSwgeSA9IHVuaXQoMSwgIm5wYyIpKQ0KDQogICAgc2Vla1ZpZXdwb3J0KCJnbG9iYWwiKQ0KICAgIGdyaWQucmVjdChsb2MxJHgsIGxvYzEkeSwgd2lkdGggPSBsb2MyJHggLSBsb2MxJHgsIGhlaWdodCA9IGxvYzIkeSAtIGxvYzEkeSwgDQogICAgICAgIGp1c3QgPSBjKCJsZWZ0IiwgImJvdHRvbSIpLCBncCA9IGdwKQ0KICAgIGlmKCFpcy5udWxsKGxhYmVsKSkgew0KICAgICAgICBncmlkLnRleHQobGFiZWwsIHggPSAobG9jMSR4ICsgbG9jMiR4KSowLjUsIHkgPSAobG9jMSR5ICsgbG9jMiR5KSowLjUsIGdwID0gbGFiZWxfZ3ApDQogICAgfQ0KfQ0KDQpncm91cF9ibG9ja19hbm5vKDE6MSwgImVtcHR5MSIsIGdwID0gZ3BhcihmaWxsID0gImdyYXk3MCIpLCBsYWJlbCA9ICJETVNPIikNCmdyb3VwX2Jsb2NrX2Fubm8oMjoyLCAiZW1wdHkxIiwgZ3AgPSBncGFyKGZpbGwgPSAicGFsZWdyZWVuMyIpLCBsYWJlbCA9ICJUMytJT1AiKQ0KZ3JvdXBfYmxvY2tfYW5ubygzOjMsICJlbXB0eTEiLCBncCA9IGdwYXIoZmlsbCA9ICJsaWdodGNvcmFsIiksIGxhYmVsID0gIk1QSSIpDQpncm91cF9ibG9ja19hbm5vKDQ6NCwgImVtcHR5MSIsIGdwID0gZ3BhcihmaWxsID0gImxpZ2h0c2t5Ymx1ZSIpLCBsYWJlbCA9ICJDUEYiKQ0KZ3JvdXBfYmxvY2tfYW5ubyg1OjUsICJlbXB0eTEiLCBncCA9IGdwYXIoZmlsbCA9ICJvcmNoaWQyIiksIGxhYmVsID0gIkNQRitUMytJT1AiKQ0KDQoNCmBgYA0KDQojIyMjIHstfQ0KDQojIyMgRGlmZmVyZW50aWFsIEV4cHJlc3Npb24gQW5hbHlzaXMNCg0KIyMjIyB7LnRhYnNldH0NCiMjIyMjIERpZmZlcmVudGlhbCBnZW5lIGV4cHJlc3Npb24gYW5hbHlzaXMNCg0KYHIgZW1vOjpqaSgibWFnbmlmeWluZyBnbGFzcyB0aWx0ZWQgcmlnaHQiKWAgIEZvciBkaWZmZXJlbnRpYWwgZXhwcmVzc2lvbiAsIGdlbmUgZXhwcmVzc2lvbiBpcyByYXJlbHkgY29uc2lkZXJlZCBhdCB0aGUgbGV2ZWwgb2YgcmF3IGNvdW50cyBzaW5jZSBsaWJyYXJpZXMgc2VxdWVuY2VkIGF0IGEgZ3JlYXRlciBkZXB0aCB3aWxsIHJlc3VsdCBpbiBoaWdoZXIgY291bnRzLiBSYXRoZXIsIGl0IGlzIGNvbW1vbiBwcmFjdGljZSB0byB0cmFuc2Zvcm0gcmF3IGNvdW50cyBvbnRvIGEgc2NhbGUgdGhhdCBhY2NvdW50cyBmb3Igc3VjaCBsaWJyYXJ5IHNpemUgZGlmZmVyZW5jZXMuIFBvcHVsYXIgdHJhbnNmb3JtYXRpb25zIGluY2x1ZGUgY291bnRzIHBlciBtaWxsaW9uIChDUE0pLCBsb2cyLWNvdW50cyBwZXIgbWlsbGlvbiAobG9nLUNQTSksIHJlYWRzIHBlciBraWxvYmFzZSBvZiB0cmFuc2NyaXB0IHBlciBtaWxsaW9uIChSUEtNKSwgYW5kIGZyYWdtZW50cyBwZXIga2lsb2Jhc2Ugb2YgdHJhbnNjcmlwdCBwZXIgbWlsbGlvbiAoRlBLTSkuIEhlcmUgcmF3IGNvdW50cyBhcmUgY29udmVydGVkIGxvZy1DUE0gdmFsdWVzIHVzaW5nIHRoZSB2b29tIGZ1bmN0aW9uIGluIGxpbW1hIHBhY2thZ2UuDQoNCjxici8+DQo8cCBjbGFzcz0iY29tbWVudCI+DQoqKldoYXQgaXMgdm9vbSBkb2luZz8qKiBDb3VudHMgYXJlIHRyYW5zZm9ybWVkIHRvIGxvZzIgY291bnRzIHBlciBtaWxsaW9uIHJlYWRzIChDUE0pLCB3aGVyZSDigJxwZXIgbWlsbGlvbiByZWFkc+KAnSBpcyBkZWZpbmVkIGJhc2VkIG9uIHRoZSBub3JtYWxpemF0aW9uIGZhY3RvcnMgd2UgY2FsY3VsYXRlZCBlYXJsaWVyDQpBIGxpbmVhciBtb2RlbCBpcyBmaXR0ZWQgdG8gdGhlIGxvZzIgQ1BNIGZvciBlYWNoIGdlbmUsIGFuZCB0aGUgcmVzaWR1YWxzIGFyZSBjYWxjdWxhdGVkDQpBIHNtb290aGVkIGN1cnZlIGlzIGZpdHRlZCB0byB0aGUgc3FydChyZXNpZHVhbCBzdGFuZGFyZCBkZXZpYXRpb24pIGJ5IGF2ZXJhZ2UgZXhwcmVzc2lvbiAoc2VlIHJlZCBsaW5lIGluIHBsb3QgYWJvdmUpDQpUaGUgc21vb3RoZWQgY3VydmUgaXMgdXNlZCB0byBvYnRhaW4gd2VpZ2h0cyBmb3IgZWFjaCBnZW5lIGFuZCBzYW1wbGUgdGhhdCBhcmUgcGFzc2VkIGludG8gbGltbWEgYWxvbmcgd2l0aCB0aGUgbG9nMiBDUE1zLg0KPC9wPg0KDQpgYGB7ciBlY2hvPUZBTFNFLCBmaWcuaGVpZ2h0PTYsIGZpZy53aWR0aD0xMCwgd2FybmluZz1GLCBwYWdlZC5wcmludD1GQUxTRX0NCiMgaHR0cHM6Ly9ycHVicy5jb20vanJnb256YWxleklTR2xvYmFsL3RyYW5zY3JpcHRvbWljX2FuYWx5c2VzDQojd2Ugd2lsbCB3b3JrIGZyb20gb3VyIGZpbHRlcmVkIG9iamVjdCAoaS5lLiB1bnRyYW5zZm9ybWVkKSBER0Vfb2JqZWN0X2ZpbHRlcmVkbm9ybWVkIChOb3QgQ1BNIGJlY2F1c2Ugdm9vbSB3aWxsIGRvIGxvZzJDUE0gYXV0b21hdGljYWxseSkNCg0KI0xvYWQgdGhlIG9iamVjdCAiREdFX29iamVjdF9maWx0ZXJlZG5vcm1lZCIgYW5kIHBsb3Qgc3VtbWFyeSBwbG90cyBhcyByZW1pbmRlcg0KbG9hZCgiRDovL0FvY2VsbGFyaXNfQ1BGX01QSV9UMy9TYXZlZF9vYmplY3RzL0RHRV9vYmplY3RfZmlsdGVyZWRub3JtZWQucmRzIikNCg0KIyBzZXQgc3BhY2UgZm9yIDUgcGxvdHMNCnBhcihtZnJvdz1jKDIsMykpDQoNCnBsb3QoMToxMDAsIHR5cGU9Im4iLCB4YXh0PSJuIiwgeWF4dD0ibiIsIGJ0eT0ibiIsIHhsYWI9IiIsIHlsYWI9IiIpDQp0ZXh0KHg9NTAsIHk9NTAsICJTdW1tYXJ5IHBhcmFtZXRlcnMgXG4gb2YgbG9hZGVkIERHRSBvYmplY3QgXG4gKGZpbHRlcmVkLCBUTU0gbm9ybWFsaXNlZCkiLCBjZXg9MS4yKQ0KDQojTElCUkFSWSBTSVpFUw0KDQojUGxvdCBsaWJyYXJ5IHNpemVzIEFGVEVSIG5vcm1hbGlzYXRpb24gKHJlbGF0aXZlIHRvIHNtYWxsZXN0IG9uZSkNCiMgbm90aWNlIHRoYXQgZXZlbiB0aGUgbm9ybWFsaXNlZCBER0Ugb2JqZWN0IGRvZXMgbm90IHN0b3JlIHRoZSBjb252ZXJ0ZWQgbGliLnNpemVzIChsaWIuc2l6ZSAqIG5vcm0gZmFjdG9yKQ0KIyB5b3UgbmVlZCB0byBjYWxjdWxhdGUgaXQgZXhwbGljaXRlbHkgd2l0aCBlZmZlY3RpdmVMaWJTaXplcygpLCBub3cgZ2V0Tm9ybUxpYlNpemVzDQoNCmJhcnBsb3QoZ2V0Tm9ybUxpYlNpemVzKERHRV9vYmplY3RfZmlsdGVyZWRub3JtZWQsIGxvZyA9IEYpLzFlNiwNCiAgICAgICAgI2VmZmVjdGl2ZUxpYlNpemVzKERHRV9vYmplY3RfZmlsdGVyZWRub3JtZWQsIGxvZyA9IEYpL2VmZmVjdGl2ZUxpYlNpemVzKERHRV9vYmplY3RfZmlsdGVyZWRub3JtZWQsIGxvZyA9IEYpWzIxXSwgI2kuZS4gcmVmZXJlbmNlIHRvIHNhbXBsZSAyMQ0KICAgICAgICBuYW1lcz1jb2xuYW1lcyhER0Vfb2JqZWN0X2ZpbHRlcmVkbm9ybWVkKSwgICAgICAgICAgICAgICAgICAjIHVzZSBzYW1wbGUgbmFtZXMNCiAgICAgICAgbGFzPTIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBUaGUgbGFzIGFyZ3VtZW50IHJvdGF0ZXMgdGhlIGF4aXMgbmFtZXMNCiAgICAgICAgYW5uPUZBTFNFLCANCiAgICAgICAgY2V4Lm5hbWVzPTAuNzUsDQogICAgICAgIGNvbCA9IGNvbG9yX2xpc3QsDQogICAgICAgIGJvcmRlciA9IE5BLA0KICAgICAgICB5bGltPXJhbmdlKHByZXR0eShjKDAsIDE1KSkpLCAjb3RoZXJ3aXNlIHkgYXhpcyB0b28gc2hvcnQNCiAgICAgICAgI3lsaW09cmFuZ2UocHJldHR5KGMoMCwgNCkpKSAgI2lmIHNob3dpbmcgcmVsYXRpdmUgc2l6ZQ0KICAgICAgICApDQptdGV4dChzaWRlID0gMSwgdGV4dCA9ICJTYW1wbGVzIiwgbGluZSA9IDQpDQptdGV4dChzaWRlID0gMiwgdGV4dCA9ICJMaWJyYXJ5IHNpemUgKG1pbGxpb25zKSIsIGxpbmUgPSAzKQ0KdGl0bGUoIkVmZmVjdGl2ZSBsaWJyYXJ5IHNpemUgXG4gKFRNTS1hZGp1c3RlZCBmb3IgY29tcG9zaXRpb25hbCBiaWFzKSIpDQojYWJsaW5lKGg9MSxjb2w9ImRvZGdlcmJsdWUiKQ0KDQojQk9YUExPVCBDT1VOVFMNCg0KYm94cGxvdChsb2cyKGFzLm1hdHJpeChER0Vfb2JqZWN0X2ZpbHRlcmVkbm9ybWVkJGNvdW50cykrMC4yNSksIA0KICAgICAgICB4bGFiPSIiLCANCiAgICAgICAgeWxhYj0ibG9nMiAoY291bnRzKzAuMjUpIiwNCiAgICAgICAgI3lsaW09YygwLDIwKSwNCiAgICAgICAgbGFzPTIsDQogICAgICAgIGNvbCA9IGNvbG9yX2xpc3QsDQogICAgICAgIGJvcmRlciA9ICJncmF5IikNCiMgTGV0J3MgYWRkIGEgYmx1ZSBob3Jpem9udGFsIGxpbmUgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgbWVkaWFuIGxvZ0NQTQ0KYWJsaW5lKGg9bWVkaWFuKGxvZzIoYXMubWF0cml4KERHRV9vYmplY3RfZmlsdGVyZWRub3JtZWQkY291bnRzKSswLjI1KSksY29sPSJibHVlIikNCnRpdGxlKCJCb3hwbG90cyBvZiBER0UgY291bnRzIikNCg0KDQojQ09VTlQgREVOU0lUWSBESVNUUklCVVRJT04NCg0KcGxvdChkZW5zaXR5KGxvZzIoYXMubWF0cml4KERHRV9vYmplY3RfZmlsdGVyZWRub3JtZWQkY291bnRzWywxXSkrMC4yNSkpLCANCiAgICAgbWFpbj0iIiwNCiAgICAgY29sPSBjb2xvcl9saXN0WzFdLA0KICAgICB4bGFiPSJsb2cyIChjb3VudHMrMC4yNSkiLA0KICAgICB5bGFiPSJEZW5zaXR5IiwNCiAgICAgeWxpbT1yYW5nZShwcmV0dHkoYygwLCAwLjI1KSkpDQogICAgICkNCg0KZm9yIChpIGluIDI6bmNvbChER0Vfb2JqZWN0X2ZpbHRlcmVkbm9ybWVkJGNvdW50cykpIHsNCiAgbGluZXMoZGVuc2l0eShsb2cyKGFzLm1hdHJpeChER0Vfb2JqZWN0X2ZpbHRlcmVkbm9ybWVkJGNvdW50c1ssaV0pKzAuMjUpKSwgDQogICAgICAgIGNvbD0gY29sb3JfbGlzdFtpXQ0KICAgICAgICApDQogIHRpdGxlKG1haW4gPSBOVUxMKQ0KfQ0KIyBMZXQncyBhZGQgYSBibHVlIHZlcnRpY2FsIGxpbmUgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgbWVkaWFuIGxvZ0NQTQ0KYWJsaW5lKHY9bWVkaWFuKGxvZzIoYXMubWF0cml4KERHRV9vYmplY3RfZmlsdGVyZWRub3JtZWQkY291bnRzKSkrMC4yNSksY29sPSJibHVlIikNCnRpdGxlKCJEZW5zaXR5IGRpc3RyaWJ1dGlvbiBvZiBER0UgY291bnRzIikNCg0KI01FQU4tVkFSSUFOQ0UgUExPVA0KIyBkZWZpbmUgYSBmdW5jdGlvbiB0aGF0IGNhbGN1bGF0ZXMgdmFyaWFuY2UNCnJvd1ZhciA8LSBmdW5jdGlvbih4KSBhcHBseSh4LDEsdmFyKQ0KDQpwbG90KHJvd01lYW5zKGxvZzIoREdFX29iamVjdF9maWx0ZXJlZG5vcm1lZCRjb3VudHMrMC4yNSkpLHJvd1Zhcihsb2cyKERHRV9vYmplY3RfZmlsdGVyZWRub3JtZWQkY291bnRzKzAuMjUpKSwNCiAgICAgeGxhYj0nbG9nMiAobWVhbiBjb3VudCswLjI1KScsDQogICAgIHlsYWI9J2xvZzIgKHZhcmlhbmNlKzAuMjUpJywNCiAgICAgY29sID0gYWxwaGEoImJsYWNrIiwgMC41KSwNCiAgICAgbWFpbj0iTWVhbi12YXJpYW5jZSBwbG90IikNCg0KDQojUkxFIFBMT1RTDQpSTEVfY291bnRzREdFX2ZvcmdncGxvdCA8LSBzd2VlcChsb2cyKERHRV9vYmplY3RfZmlsdGVyZWRub3JtZWQkY291bnRzKzAuMjUpLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BUkdJTj0xLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNUQVRTPSByb3dNZWFucyhsb2cyKERHRV9vYmplY3RfZmlsdGVyZWRub3JtZWQkY291bnRzKzAuMjUpKSkNClJMRV9jb3VudHNER0VfZm9yZ2dwbG90IDwtIGFzLmRhdGEuZnJhbWUoUkxFX2NvdW50c0RHRV9mb3JnZ3Bsb3QpDQpSTEVfY291bnRzREdFX2ZvcmdncGxvdCRnZW5lcyA8LSByb3cubmFtZXMoUkxFX2NvdW50c0RHRV9mb3JnZ3Bsb3QpDQpSTEVfY291bnRzREdFX2ZvcmdncGxvdCAgPC0gUkxFX2NvdW50c0RHRV9mb3JnZ3Bsb3QgICU+JSAgcGl2b3RfbG9uZ2VyKC1nZW5lcywgbmFtZXNfdG8gPSAiQ29uZGl0aW9uIiwgdmFsdWVzX3RvID0gImRldmlhdGlvbnMiKQ0KI2xvY2sgaW4gdGhlIG9yZGVyIG9mIHRoZSBzYW1wbGVzLCBvciB0aGV5IHdpbGwgYmUgcmVhcnJhbmdlZCBkdXJpbmcgcGxvdHRpbmcNClJMRV9jb3VudHNER0VfZm9yZ2dwbG90JENvbmRpdGlvbiA8LSBmYWN0b3IoUkxFX2NvdW50c0RHRV9mb3JnZ3Bsb3QkQ29uZGl0aW9uLCBsZXZlbHMgPSAgb3JkZXJlZF9sZXZlbHMpDQoNCiNzaW5jZSB0aGlzIGlzIGEgZ2dwbG90IGFuZCB3ZSB3YW50IHRvICBwbG90IGl0IHdpdGggYmFzZVIgcGxvdHMsIHdlIG5lZWQgdG8gZG8gdGhpcw0KI2h0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzE0MTI0MzczL2NvbWJpbmUtYmFzZS1hbmQtZ2dwbG90LWdyYXBoaWNzLWluLXItZmlndXJlLXdpbmRvdw0KcGxvdC5uZXcoKSAgICAgICAgICAgICAgDQp2cHMgPC0gYmFzZVZpZXdwb3J0cygpDQpwdXNoVmlld3BvcnQodnBzJGZpZ3VyZSkgIyMgICBJIGFtIGluIHRoZSBzcGFjZSBvZiB0aGUgUkxFIHBsb3RzDQp2cDEgPC1wbG90Vmlld3BvcnQoYygxLjgsMSwwLDEpKSAjIyBjcmVhdGUgbmV3IHZwIHdpdGggbWFyZ2lucywgeW91IHBsYXkgd2l0aCB0aGlzIHZhbHVlcyANCiNwcmVwYXJlIHRoZSBhY3R1YWwgZ2dwbG90DQpwbG90NiA8LSBnZ3Bsb3QoUkxFX2NvdW50c0RHRV9mb3JnZ3Bsb3QsIGFlcyh4PUNvbmRpdGlvbiwgeT1kZXZpYXRpb25zLCBmaWxsPUNvbmRpdGlvbikpICsNCiAgZ2VvbV92aW9saW4odHJpbT1GQUxTRSkrDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1jb2xvcl9saXN0KSsNCiAgI2dlb21faml0dGVyKHNoYXBlPTE2LCBwb3NpdGlvbj1wb3NpdGlvbl9qaXR0ZXIoMC4yKSwgYWxwaGE9MC4wMSkgKw0KICAjZ2VvbV9ib3hwbG90KHdpZHRoPTAuMSwgb3V0bGllci5jb2xvciA9ICJibGFjayIsIG91dGxpZXIuYWxwaGE9MC4wMSkrDQogIHN0YXRfc3VtbWFyeShmdW49bWVkaWFuLCBwY2g9MjEsIHNpemU9MC41LCBjb2xvcj0iYmxhY2siLCBmaWxsPSJkb2RnZXJibHVlIikrDQogIHRoZW1lX2NsYXNzaWMoKSsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJub25lIiwgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwgdmp1c3QgPSAwLjUsIGhqdXN0PTEpKSsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0PTAsIGxpbmV0eXBlPSJsb25nZGFzaCIsIGNvbG9yID0gImRvZGdlcmJsdWUiLCBzaXplPTAuNSkrDQogIHlsaW0oYygtMTUsMTUpKSsNCiAgeGxhYigiIikgKyANCiAgeWxhYigiUmVsYXRpdmUgbG9nMiBleHByZXNzaW9uIG9mIGVhY2ggZ2VuZSBcbiAoZXhwcmVzc2lvbi1tZWFuKSIpKw0KICBnZ3RpdGxlKCJSZWxhdGl2ZSBMZXZlbHMgb2YgRXhwcmVzc2lvbjogXG4gREdFIGNvdW50cyIpKw0KICBOVUxMDQojcHJpbnQgdGhlIGdncGxvdCBpbiB0aGUgY29ycmVjdCB2aWV3cG9ydA0KcHJpbnQocGxvdDYsdnAgPSB2cDEpDQoNCiMjcmVtb3ZlIHVudXNlZCB2YXJpYWJsZXMgYW5kIGZ1bmN0aW9ucw0Kcm0oaSwgUkxFX2NvdW50c0RHRV9mb3JnZ3Bsb3QsIHJvd1ZhciwgdnAxLCB2cHMsIHBsb3Q2KQ0KYGBgDQoNCjxiciAvPg0KKiBfX1N0ZXAgMjpfXyAgV2UgY2FuIG5vdyBwcm9jZXNzIG91ciBvcmlnaW5hbCAoZmlsdGVyZWQsIFRNTS1ub3JtYWxpc2VkKSBvYmplY3QgdGhyb3VnaCB0aGUgdm9vbS1saW1tYSBwaXBlbGluZSwgd2hpY2ggd2lsbCBub3JtYWxpc2VkIGl0IGJ5IGxpYnJhcnkgc2l6ZSBieSBjYWxjdWxhdGluZyBsb2dDUE0gYW5kIHVzaW5nIHRoZSBub3JtYWxpc2F0aW9uIGZhY3RvcnMgcHJvdmlkZWQsIGFuZCB0aGVuIGZpdCBhIGxpbmVhciBtb2RlbCB0aHJvdWdoIGl0Og0KDQpgYGB7ciBlY2hvPUZBTFNFLCBmaWcuaGVpZ2h0PTYsIGZpZy53aWR0aD05LCB3YXJuaW5nPVRSVUUsIHBhZ2VkLnByaW50PUZBTFNFfQ0KIyBodHRwczovL3JwdWJzLmNvbS9qcmdvbnphbGV6SVNHbG9iYWwvdHJhbnNjcmlwdG9taWNfYW5hbHlzZXMNCiN3ZSB3aWxsIHdvcmsgZnJvbSBvdXIgZmlsdGVyZWQgb2JqZWN0IChpLmUuIHVudHJhbnNmb3JtZWQpIERHRV9vYmplY3RfZmlsdGVyZWRub3JtZWQgKE5vdCBDUE0gYmVjYXVzZSB2b29tIHdpbGwgZG8gbG9nMkNQTSBhdXRvbWF0b2NhbGx5KQ0KI3RoaXMgcHJvZHVjZXMgdGhlIDAvMSBkZXNpZ24gbWF0cml4LCBnZW5lIGV4cHJlc3Npb24gZGF0YSBtb2RlbGxlZCBieSBzdGFnZSANCiMgdGhpcyBqdXN0IG1lYW5zIG1vZGVsLm1hdHJpeCggfi0xKyBER0Vfb2JqZWN0X2ZpbHRlcmVkbm9ybWVkX3JlYXNzaWduZWQkc2FtcGxlcyRzdGFnZV9yZWFzc2lnbmVkKSANCm1vZGVsX21hdHJpeDwtIG1vZGVsLm1hdHJpeCggfi0xKyB0cmVhdG1lbnQsIGRhdGE9REdFX29iamVjdF9maWx0ZXJlZG5vcm1lZCRzYW1wbGVzKSANCg0KI0lmIGNvdW50cyBpcyBhIERHRUxpc3Qgb2JqZWN0IGZyb20gdGhlIGVkZ2VSIHBhY2thZ2UsIHRoZW4gdm9vbSB3aWxsIHVzZSB0aGUgbm9ybWFsaXphdGlvbiBmYWN0b3JzIGZvdW5kIGluIHRoZSBvYmplY3Qgd2hlbiBjb21wdXRpbmcgdGhlIGxvZ0NQTSB2YWx1ZXMuIEluIG90aGVyIHdvcmRzLCB0aGUgbG9nQ1BNIHZhbHVlcyBhcmUgY29tcHV0ZWQgZnJvbSB0aGUgZWZmZWN0aXZlIGxpYnJhcnkgc2l6ZXMgcmF0aGVyIHRoYW4gdGhlIHJhdyBsaWJyYXJ5IHNpemVzLiANCkRHRV9vYmplY3RfZmlsdGVyZWRub3JtZWRfVm9vbWVkIDwtIHZvb20oREdFX29iamVjdF9maWx0ZXJlZG5vcm1lZCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2lnbiA9IG1vZGVsX21hdHJpeCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsb3QgPSBGQUxTRSkgICAjd2Ugd2lsbCBwdXQgRkFMU0UgaGVyZSBhbmQgcGxvdCB0aGUgc2FtZSBkYXRhIG1hbnVhbGx5DQojYSBER0Ugb2JqZWN0IHRoYXQgaW5jb3Jwb3JhdGVzIHRoZSBtYXRyaXggYW5kIHRoZSBtZWFuLXZhcmlhbmNlIHdlaWdodHMgICANCg0KI01lYW4tdmFyaWFuY2UgcmVsYXRpb25zaGlwIG5vdyBzdG9yZWQgaW4gdm9vbSB3aWxsIGJlIGluamVjdGVkIGludG8gdGhlIHN0YXRpc3RpY2FsIG1vZGVsIGFzIG9ic2VydmF0aW9uYWwtbGV2ZWwgd2VpZ2h0cy4NCiMgV2hlbiB0aGUgd2VpZ2h0cyBhcmUgaW5jb3Jwb3JhdGVkIGludG8gYSBsaW5lYXIgbW9kZWxpbmcgcHJvY2VkdXJlLCB0aGUgbWVhbi12YXJpYW5jZSByZWxhdGlvbnNoaXAgaW4gdGhlIGxvZy1jcG0gdmFsdWVzIGlzIGVmZmVjdGl2ZWx5IGVsaW1pbmF0ZWQuDQoNCg0KI1BMT1RUSU5HDQojIHNldCBzcGFjZSBmb3IgNSBwbG90cw0KcGFyKG1mcm93PWMoMiwzKSkNCg0KcGxvdCgxOjEwMCwgdHlwZT0ibiIsIHhheHQ9Im4iLCB5YXh0PSJuIiwgYnR5PSJuIiwgeGxhYj0iIiwgeWxhYj0iIikNCnRleHQoeD01MCwgeT01MCwgIkFwcGx5aW5nIHZvb20gdG8gdGhlIFxuICBER0Ugb2JqZWN0IiwgY2V4PTEuMikNCg0KI01FQU4tVkFSSUFOQ0UgUExPVCAob3JpZ2luYWwpDQojIGRlZmluZSBhIGZ1bmN0aW9uIHRoYXQgY2FsY3VsYXRlcyB2YXJpYW5jZQ0Kcm93VmFyIDwtIGZ1bmN0aW9uKHgpIGFwcGx5KHgsMSx2YXIpDQoNCnBsb3Qocm93TWVhbnMobG9nMihER0Vfb2JqZWN0X2ZpbHRlcmVkbm9ybWVkJGNvdW50cyswLjI1KSksDQogICAgIHJvd1Zhcihsb2cyKERHRV9vYmplY3RfZmlsdGVyZWRub3JtZWQkY291bnRzKzAuMjUpKSwNCiAgICAgeGxhYj0nbWVhbiBsb2cyKGNvdW50cyswLjI1KScsDQogICAgIHlsYWI9J3ZhcmlhbmNlIGxvZzIoY291bnRzKzAuMjUpJywNCiAgICAgcGNoPTE2LA0KICAgICBjZXg9MC44LA0KICAgICBjb2wgPSBhbHBoYSgiYmxhY2siLCAwLjEwKSwNCiAgICAgbWFpbj0iTWVhbi12YXJpYW5jZSBwbG90IFxuIChvcmlnaW5hbCwgbm90IENQTS1ub3JtYWxpc2VkKSIpDQoNCg0KI01FQU4tc3FydChzdGFuZGFyZCBkZXZpYXRpb24pIChvcmlnaW5hbCkNCiMgZGVmaW5lIGEgZnVuY3Rpb24gdGhhdCBjYWxjdWxhdGVzIHZhcmlhbmNlDQpyb3dWYXIgPC0gZnVuY3Rpb24oeCkgYXBwbHkoeCwxLHZhcikNCg0KcGxvdChyb3dNZWFucyhsb2cyKERHRV9vYmplY3RfZmlsdGVyZWRub3JtZWQkY291bnRzKzAuMjUpKSwNCiAgICAgcm93VmFyKGxvZzIoREdFX29iamVjdF9maWx0ZXJlZG5vcm1lZCRjb3VudHMrMC4yNSkpXigxLzQpLA0KICAgICB4bGFiPSdtZWFuIGxvZzIoY291bnRzKzAuMjUpJywNCiAgICAgeWxhYj0nc3FydChzaWdtYSkgbG9nMihjb3VudHMrMC4yNSknLA0KICAgICBwY2g9MTYsDQogICAgIGNleD0wLjgsDQogICAgIGNvbCA9IGFscGhhKCJibGFjayIsIDAuMTApLA0KICAgICBtYWluPSJNZWFuLXNpZ21hIHBsb3QgXG4gKG9yaWdpbmFsLCBub3QgQ1BNLW5vcm1hbGlzZWQpIikNCg0KDQojTGV0IHVzIG5vdyBwbG90IHRoZSBzYW1lIGRhdGEsIGFmdGVyIENQTSBub3JtYWxpc2F0aW9uICh0aGUgc2FtZSB3YXkgdm9vbSB3b3VsZCBkbykNCg0KI01FQU4tVkFSSUFOQ0UgUExPVCAoQ1BNLW5vcm1hbGlzZWQpDQojc3RvcmUgdGhlIGxpYnJhcnkgbWlsbGlvbnMgYXMgY2FsY3VsYXRlZCBieSB2b29tIChlZmZlY3RpdmUgbGlicmFyeSBzaXplICsgMSwgYWxsIGluIG1pbGxpb25zKQ0KcGVybWlsbGlvbnMgPC0gKChER0Vfb2JqZWN0X2ZpbHRlcmVkbm9ybWVkJHNhbXBsZXMkbGliLnNpemUqREdFX29iamVjdF9maWx0ZXJlZG5vcm1lZCRzYW1wbGVzJG5vcm0uZmFjdG9ycykrMSkvMWU2DQoNCiMgZGVmaW5lIGEgZnVuY3Rpb24gdGhhdCBjYWxjdWxhdGVzIHZhcmlhbmNlDQpyb3dWYXIgPC0gZnVuY3Rpb24oeCkgYXBwbHkoeCwxLHZhcikNCg0KcGxvdChyb3dNZWFucyhsb2cyKChER0Vfb2JqZWN0X2ZpbHRlcmVkbm9ybWVkJGNvdW50cyswLjUpL3Blcm1pbGxpb25zKSkrbWVhbihsb2cyKHBlcm1pbGxpb25zKSksICNub3RlIHRoYXQgdm9vbSBhZGRzIDAuNSwgbm90IDAuMjUgI2Fsc28sIGZvciBzb21lIHJlYXNvbiB2b29tIGFkZHMgdGhlIGxvZzIgb2YgdGhlIG1lYW4gbGlicmFyeXNpemUgKGluIG1pbGxpb25zKQ0KICAgICByb3dWYXIobG9nMigoREdFX29iamVjdF9maWx0ZXJlZG5vcm1lZCRjb3VudHMrMC41KS9wZXJtaWxsaW9ucykpLA0KICAgICB4bGFiPSdtZWFuIGxvZzIoY291bnRzKzAuNSkrIFxuIGF2ZXJhZ2UgbGlicmFyeSBzaXplJywNCiAgICAgeWxhYj0ndmFyaWFuY2UgbG9nMihjb3VudHMrMC41KScsDQogICAgIHBjaD0xNiwNCiAgICAgY2V4PTAuOCwNCiAgICAgY29sID0gYWxwaGEoImJsYWNrIiwgMC4xMCksDQogICAgIG1haW49Ik1lYW4tdmFyaWFuY2UgcGxvdCBcbiAoQ1BNLW5vcm1hbGlzZWQpIikNCg0KDQojTUVBTi1zcXJ0KHN0YW5kYXJkIGRldmlhdGlvbikgKENQTS1ub3JtYWxpc2VkKQ0KIyBkZWZpbmUgYSBmdW5jdGlvbiB0aGF0IGNhbGN1bGF0ZXMgdmFyaWFuY2UNCnJvd1ZhciA8LSBmdW5jdGlvbih4KSBhcHBseSh4LDEsdmFyKQ0KDQpwbG90KHJvd01lYW5zKGxvZzIoKERHRV9vYmplY3RfZmlsdGVyZWRub3JtZWQkY291bnRzKzAuNSkvcGVybWlsbGlvbnMpKSttZWFuKGxvZzIocGVybWlsbGlvbnMpKSwNCiAgICAgcm93VmFyKGxvZzIoKERHRV9vYmplY3RfZmlsdGVyZWRub3JtZWQkY291bnRzKzAuNSkvcGVybWlsbGlvbnMpKV4oMS80KSwNCiAgICAgeGxhYj0nbWVhbiBsb2cyKGNvdW50cyswLjUpKyBcbiBhdmVyYWdlIGxpYnJhcnkgc2l6ZScsDQogICAgIHlsYWI9J3NxcnQoc2lnbWEpIGxvZzIoY291bnRzKzAuNSknLA0KICAgICBwY2g9MTYsDQogICAgIGNleD0wLjgsDQogICAgIGNvbCA9IGFscGhhKCJibGFjayIsIDAuMTApLA0KICAgICBtYWluPSJNZWFuLXNpZ21hIHBsb3QgXG4gKENQTS1ub3JtYWxpc2VkKSIpDQoNCiNNRUFOLVZBUklBTkNFIFBMT1QgKGFzIHBsb3R0ZWQgYnkgdm9vbSkNCiMgaHR0cHM6Ly9yZHJyLmlvL2Jpb2MvbGltbWEvc3JjL1Ivdm9vbS5SDQoNCmxpYi5zaXplIDwtIERHRV9vYmplY3RfZmlsdGVyZWRub3JtZWQkc2FtcGxlcyRsaWIuc2l6ZSpER0Vfb2JqZWN0X2ZpbHRlcmVkbm9ybWVkJHNhbXBsZXMkbm9ybS5mYWN0b3JzDQpjb3VudHMgPC0gREdFX29iamVjdF9maWx0ZXJlZG5vcm1lZCRjb3VudHMNCiNGaXQgbGluZWFyIG1vZGVsIHRvIGxvZzItY291bnRzLXBlci1taWxsaW9uDQp5IDwtIHQoDQogIGxvZzIoDQogICAgdChjb3VudHMrMC41KS8obGliLnNpemUrMSkqMWU2DQogICAgKQ0KICAgICAgICkNCmZpdCA8LSBsbUZpdCh5LG1vZGVsX21hdHJpeCkNCg0KI01FQU4tVkFSSUFOQ0UgUExPVCAyDQojIGRlZmluZSBhIGZ1bmN0aW9uIHRoYXQgY2FsY3VsYXRlcyB2YXJpYW5jZQ0KIwlGaXQgbG93ZXNzIHRyZW5kIHRvIHNxcnQtc3RhbmRhcmQtZGV2aWF0aW9ucyBieSBsb2ctY291bnQtc2l6ZQ0Kc3ggPC0gZml0JEFtZWFuK21lYW4obG9nMihsaWIuc2l6ZSsxKSktbG9nMigxZTYpDQpzeSA8LSBzcXJ0KGZpdCRzaWdtYSkNCg0KbCA8LSBsb3dlc3Moc3gsc3ksZj0wLjUpDQoNCnBsb3Qoc3gsDQogICAgIHN5LA0KICAgICB4bGFiPSJsb2cyKCBjb3VudCBzaXplICsgMC41ICkgKyBcbiBhdmVyYWdlIGxpYnJhcnkgc2l6ZSIsDQogICAgIHlsYWI9IlNxcnQoIHN0YW5kYXJkIGRldmlhdGlvbiApIiwNCiAgICAgcGNoPTE2LA0KICAgICBjZXg9MC44LA0KICAgICBjb2wgPSBhbHBoYSgiYmxhY2siLCAwLjEwKSkNCnRpdGxlKCJ2b29tOiBNZWFuLXZhcmlhbmNlIHRyZW5kIikNCmxpbmVzKGwsY29sPSJkb2RnZXJibHVlIixsd2Q9Mi4wKQ0KDQojcmVtb3ZlIHVudXNlZCB2YXJpYWJsZXMNCnJtKGNvdW50cywgREdFX29iamVjdF9maWx0ZXJlZG5vcm1lZCwgZml0LCBsLCB5LCBwZXJtaWxsaW9ucywgc3gsIHN5LCByb3dWYXIpDQoNCg0KI1NhdmUgdGhlIHZvb21lZCAoZmlsdGVyZWQsIFRNTS1ub3JtYWxpc2VkICsgbG9nQ1BNKSwgc3RhZ2UtcmVhc3NpZ25lZCwgb2JqZWN0IGZvciBkaWZmZXJlbnRpYWwgZXhwcmVzc2lvbiBhbmFseXNpcw0KI3NhdmUoREdFX29iamVjdF9maWx0ZXJlZG5vcm1lZF9Wb29tZWQsIGZpbGUgPSAiRDovL0FvY2VsbGFyaXNfQ1BGX01QSV9UMy9TYXZlZF9vYmplY3RzL0RHRV9vYmplY3RfZmlsdGVyZWRub3JtZWRfVm9vbWVkLnJkcyIpDQoNCmBgYA0KPHAgY2xhc3M9ImNvbW1lbnQiPg0KTm90aWNlIGhvdyBJIGNvdWxkIG5vdCBxdWl0ZSByZXByb2R1Y2UgdGhlIGxpbW1hLWxtRml0IGNhbGN1bGF0ZWQgc2lnbWEgdmFsdWVzLiAoY29tcGFyZSB3aXRoIG1hbnVhbGx5IGdlbmVyYXRlZCBvbmVzIGluIHBsb3QganVzdCBuZXh0IHRvIGl0KS4gV2lsbCBuZWVkIHRvIGZpZ3VyZSBvdXQgdGhlIGRldGFpbHMgb2YgdGhlIGxpbW1hIHNpZ21hIGNhbGN1bGF0aW9uLg0KPC9wPg0KDQoNCmBgYHtyIGVjaG89RkFMU0V9DQojIHN0YW5kYXJkIHBpcGVsaW5lIHdpdGggbG1GSVQgYnV0IHRyeSBsbSgpIFtjaHVuY2sgYWJvdmVdDQoNCiMgYXBwbHkgbGluZWFyIHJlZ3Jlc3Npb24gbW9kZWwgd2l0aCBtZWFuLXZhcmlhbmNlIHJlbGF0aW9uc2hpcCB3ZWlnaHRzIGNhbGN1bGF0ZWQgYWJvdmUNCiMgbG1GaXQgZml0cyBhIGxpbmVhciBtb2RlbCB1c2luZyB3ZWlnaHRlZCBsZWFzdCBzcXVhcmVzIGZvciBlYWNoIGdlbmU6DQojZXh0cmFjdCB0aGUgbGluZWFyIG1vZGVscyB0aGF0IGhhZCBiZWVuIGZpdCBpbiB0aGUgdm9vbSBvYmplY3QNCmZpdF9yZXN1bHRzIDwtIGxtRml0KERHRV9vYmplY3RfZmlsdGVyZWRub3JtZWRfVm9vbWVkKSAjdGhpcyBpcyB0aGUgc2FtZSBhcyBkb2luZyAjZml0X3Jlc3VsdHMgPC0gbG1GaXQoREdFX29iamVjdF9maWx0ZXJlZG5vcm1lZF9Wb29tZWQsIHdlaWdodHM9REdFX29iamVjdF9maWx0ZXJlZG5vcm1lZF9Wb29tZWRbWyJ3ZWlnaHRzIl1dKQ0KDQojc2FtZSBhcyBkb2luZyBsbSgpIGluZGl2aWR1YWxseSBvbiBlYWNoIGdlbmUgKGNhbiBhbHNvIHN1cHBseSBoZXJlIHRoZSBtb2RlbCBtYXRyaXgsIGJ1dCBhbHJlYWR5IGluY29ycG9yYXRlZCB0aHJvdWdoIHZvb21pbmcpDQpoZWFkKGNvZWYoZml0X3Jlc3VsdHMpKQ0KYGBgDQoNCg0KDQoNCiMjIyMjIGVmZmVjdCBvZiBDUEYgKENQRiB2cyBETVNPKQ0KDQoNCmBgYHtyLCBlY2hvPUZBTFNFLCByZXN1bHRzID0gRkFMU0V9DQojTG9hZCB2b29tIG9iamVjdCAiREdFX29iamVjdF9maWx0ZXJlZG5vcm1lZF9Wb29tZWQiIGZvciBkaWZmZXJlbnRpYWwgZXhwcmVzc2lvbiBhbmFseXNpcywgYW5kIGFubm90YXRpb24gaW5mbw0KbG9hZCgiRDovL0FvY2VsbGFyaXNfQ1BGX01QSV9UMy9TYXZlZF9vYmplY3RzL0RHRV9vYmplY3RfZmlsdGVyZWRub3JtZWRfVm9vbWVkLnJkcyIpDQpsb2FkKCJDOi8vVXNlcnMvRG9jdG9yL0Rlc2t0b3AvUk5Bc2VxX2FuYWx5c2VzL2Fubm90YXRpb25faW5mb19OQ0JJRW5zZW1ibF9jdXJhdGVkLnJkcyIpIA0KDQojcmVuYW1lIHRoZSBkYXRhZnJhbWUgYXMgImFubm90YXRpb25faW5mbyINCmFubm90YXRpb25faW5mbyA8LSBhbm5vdGF0aW9uX2luZm9fTkNCSUVuc2VtYmwNCiNyZW1vdmUgdGhlIGNvbHVtbiB3aXRoIHRoZSBvcmlnaW5hbCBkZXNjcmlwdGlvbg0KI2Fubm90YXRpb25faW5mbyA8LSBzdWJzZXQoYW5ub3RhdGlvbl9pbmZvLCBzZWxlY3QgPSAtYyhvcmlnaW5hbF9kZXNjcmlwdGlvbikpDQoNCiNyZW1vdmUgdW51c2VkIHZhcmlhYmxlcw0Kcm0oYW5ub3RhdGlvbl9pbmZvX05DQklFbnNlbWJsKQ0KDQojLS0tLS0tLS0tLQ0KDQojIGFwcGx5IGxpbmVhciByZWdyZXNzaW9uIG1vZGVsIHdpdGggbWVhbi12YXJpYW5jZSByZWxhdGlvbnNoaXAgd2VpZ2h0cyBjYWxjdWxhdGVkIGFib3ZlDQojIGxtRml0IGZpdHMgYSBsaW5lYXIgbW9kZWwgdXNpbmcgd2VpZ2h0ZWQgbGVhc3Qgc3F1YXJlcyBmb3IgZWFjaCBnZW5lOg0KI2V4dHJhY3QgdGhlIGxpbmVhciBtb2RlbHMgdGhhdCBoYWQgYmVlbiBmaXQgaW4gdGhlIHZvb20gb2JqZWN0DQpmaXRfcmVzdWx0cyA8LSBsbUZpdChER0Vfb2JqZWN0X2ZpbHRlcmVkbm9ybWVkX1Zvb21lZCkgI3RoaXMgaXMgdGhlIHNhbWUgYXMgZG9pbmcgI2ZpdF9yZXN1bHRzIDwtIGxtRml0KERHRV9vYmplY3RfZmlsdGVyZWRub3JtZWRfVm9vbWVkLCB3ZWlnaHRzPURHRV9vYmplY3RfZmlsdGVyZWRub3JtZWRfVm9vbWVkW1sid2VpZ2h0cyJdXSkNCg0KI3NhbWUgYXMgZG9pbmcgbG0oKSBpbmRpdmlkdWFsbHkgb24gZWFjaCBnZW5lIChjYW4gYWxzbyBzdXBwbHkgaGVyZSB0aGUgbW9kZWwgbWF0cml4LCBidXQgYWxyZWFkeSBpbmNvcnBvcmF0ZWQgdGhyb3VnaCB2b29taW5nKQ0KaGVhZChjb2VmKGZpdF9yZXN1bHRzKSkNCmBgYA0KDQoNCmBgYHtyLCBlY2hvPUZBTFNFLCBmaWcuaGVpZ2h0PTIuNSwgZmlnLndpZHRoPTksIHdhcm5pbmc9VFJVRSwgcGFnZWQucHJpbnQ9RkFMU0V9DQojQ29tcHV0ZSBjb21wYXJpc29ucyBvZiBpbnRlcmVzdA0KDQojQ29tcGFyaXNvbnMgYmV0d2VlbiBncm91cHMgKGxvZyBmb2xkLWNoYW5nZXMpIGFyZSBvYnRhaW5lZCBhcyBjb250cmFzdHMgb2YgdGhlc2UgZml0dGVkIGxpbmVhciBtb2RlbHM6DQpjb250cmFzdF9tYXRyaXggPC0gbWFrZUNvbnRyYXN0cyh0cmVhdG1lbnRDUEYgLSB0cmVhdG1lbnRETVNPICwgICMgcG9zaXRpdmUgbG9nY2hhbmdlcyB3aWxsIGJlIGhpZ2hlciBpbiBTNCwgbmVnYXRpdmUgd2lsbCBiZSBoaWdoZXIgaW4gUzENCiAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gY29sbmFtZXMoY29lZihmaXRfcmVzdWx0cykpKQ0KI3Nob3cgbmV3bHkgY3JlYXRlZCBjb250cmFzdCBtYXRyaXgNCmNvbnRyYXN0X21hdHJpeCAgIyBwb3NpdGl2ZSBsb2djaGFuZ2VzIHdpbGwgYmUgaGlnaGVyIGluIFM0LCBuZWdhdGl2ZSB3aWxsIGJlIGhpZ2hlciBpbiBTMQ0KDQojYWRkIHRoZSBjb250cmFzdCBtYXRyaXggdG8gb3VyIGZpdCBvYmplY3QNCiMgbmVlZCB0byBkbyBuZXcgb2JqZWN0cyBvciBpdCBjaGVuZ2VzICBjb2VmZmljaWVudHMgaW5zdGVhZD8NCmZpdF9yZXN1bHRzX2NvbnRyYXN0ZWQgPC0gY29udHJhc3RzLmZpdChmaXRfcmVzdWx0cywgY29udHJhc3RfbWF0cml4KQ0KDQojRW1waXJpY2FsIEJheWVzIHNtb290aGluZyBvZiBzdGFuZGFyZCBlcnJvcnMgKHNocmlua3Mgc3RhbmRhcmQgZXJyb3JzIHRoYXQgYXJlIG11Y2ggbGFyZ2VyIG9yIHNtYWxsZXIgdGhhbiB0aG9zZSBmcm9tIG90aGVyIGdlbmVzIHRvd2FyZHMgdGhlIGF2ZXJhZ2Ugc3RhbmRhcmQgZXJyb3IpIChzZWUgaHR0cHM6Ly93d3cuZGVncnV5dGVyLmNvbS9kb2kvMTAuMjIwMi8xNTQ0LTYxMTUuMTAyNykNCmZpdF9yZXN1bHRzX2NvbnRyYXN0ZWQgPC0gZUJheWVzKGZpdF9yZXN1bHRzX2NvbnRyYXN0ZWQpICN3aGVuIGFwcGxpZWQgdG8gdGhlIG91dHB1dCBvZiBsbUZpdCgpLCBwZXJmb3JtcyB0aGUgcG9vbGVkIGVzdGltYXRpb24gb2Ygc3RhbmRhcmQgZXJyb3JzIHRoYXQgcmVzdWx0cyBpbiB0aGUgbW9kZXJhdGVkIHQtc3RhdGlzdGljcyBhbmQgcmVzdWx0aW5nIHAtdmFsdWVzLg0KDQojcC5hZGp1c3QgKGJ1dCB0aGlzIHdpbGwgYmUgZG9uZSBhdXRvbWF0aWNhbGx5IGJ5IFRvcFRhYmxlIGZ1bmN0aW9uKQ0KI2luZGl2LlAudmFsdWVzPC1hcHBseSh0bXBbWyJwLnZhbHVlIl1dLCAyLCBwLmFkanVzdCwgbWV0aG9kPSJCSCIpDQojdG1wW1siQkguYWRqdXN0ZWQucHZhbHVlIl1dIDwtIGluZGl2LlAudmFsdWVzDQoNCg0KI3JlbW92ZSB1bnVzZWQgdmFyaWFibGVzDQpybShmaXRfcmVzdWx0cywgREdFX29iamVjdF9maWx0ZXJlZG5vcm1lZF9Wb29tZWQpDQpgYGANCjxici8+DQpCZWxvdywgYSBsaXN0IG9mIGFsbCB0aGUgZ2VuZXMgdGhhdCBhcHBlYXIgc2lnbmlmaWNhbnRseSBkaWZmZXJlbnRseSBleHByZXNzZWQgYmV0d2VlbiB0cmVhdG1lbnQgYW5kIGNvbnRyb2wgKGluIGVpdGhlciBkaXJlY3Rpb247IF9fVGFibGUgMV9fKS4gSW4gX19UYWJsZSAyX18sIHRoZSBzdWJlc3Qgb2Ygc2lnbmlmaWNhbnRseSBjaGFuZ2luZyBnZW5lcyB3aG9zZSBmb2xkLWNoYW5nZSBpcyBiaWdnZXIgdGhhbiAyZm9sZHMgKGluIGVpdGhlciBkaXJlY3Rpb24pLiBUaGVzZSBnZW5lcyBhcmUgcmFua2VkIGluIG9yZGVyIG9mIGRlY3JlYXNpbmcgZm9sZCBjaGFuZ2UuIDxici8+DQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KI1doYXQgZ2VuZXMgYXJlIG1vc3QgZGlmZmVyZW50aWFsbHkgZXhwcmVzc2VkPw0KZnVsbF90b3BfdGFibGUgPC0gdG9wVGFibGUoZml0X3Jlc3VsdHNfY29udHJhc3RlZCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICBzb3J0LmJ5ID0gImxvZ0ZDIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICBuID0gSW5mLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkanVzdC5tZXRob2Q9IkJIIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpbnQ9MC45NSwgI25vdGUgdGhhdCB0aGVzZSBhcmUgbm90IGFkanVzdGVkIGZvciBtdWx0aXBsZSB0ZXN0aW5nIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgI3AudmFsdWU9MC4wNQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgKQ0KDQojY3JlYXRlIGNvbHVtbiB0aGF0IHNob3dzIGxvZ0ZvbGRDaGFuZ2UgYXMgdGhlIEZvbGQgQ2hhbmdlDQpmdWxsX3RvcF90YWJsZVsiRkMiXSA8LSBzaWduKGZ1bGxfdG9wX3RhYmxlWyJsb2dGQyJdKSoyXmFicyhmdWxsX3RvcF90YWJsZVsibG9nRkMiXSkNCg0KI3NhdmUgbGlzdA0KI3NhdmUoZnVsbF90b3BfdGFibGUsIGZpbGUgPSAiRDovL0FvY2VsbGFyaXNfQ1BGX01QSV9UMy9TYXZlZF9vYmplY3RzL2Z1bGxfdG9wX3RhYmxlX0NQRnZzRE1TTy5yZHMiKQ0KI2xvYWQoZmlsZSA9ICJDOi8vVXNlcnMvRG9jdG9yL0Rlc2t0b3AvUk5Bc2VxX2FuYWx5c2VzL0FvY2VsbGFyaXNfZ3V0X21ldGFtb3JwaG9zaXNfbGl2ZXIvU2F2ZWRfb2JqZWN0cy9mdWxsX3RvcF90YWJsZV9TNHZzUzEucmRzIikNCmBgYA0KDQpgYGB7ciwgZWNobz1GQUxTRX0NCiNmaW5kIGdlbmVzIHdpdGggYWRqdXN0ZWQgcHZhbHVlDQpzaWduaWZpY2FudCA8LSBmdWxsX3RvcF90YWJsZSRhZGouUC5WYWwgPCAwLjA1DQojc3Vic2V0IGdlbmVzIHRoYXQgYXJlIHNpZ25pZmljYW50bHkgdXByZWd1bGF0ZWQNCnVwcmVndWxhdGVkIDwtIHNpZ25pZmljYW50ICYgc2lnbihmdWxsX3RvcF90YWJsZSRGQykgPT0gMQ0KI3N1YmVzdCBnZW5lIHRoYXQgYXJlIHNpZ25pZmljYW50bHkgZG93bnJlZ3VsYXRlZA0KZG93bnJlZ3VsYXRlZCA8LSBzaWduaWZpY2FudCAmIHNpZ24oZnVsbF90b3BfdGFibGUkRkMpID09IC0xDQojZmluZCBnZW5lcyB0aGF0IGNoYW5nZSBtb3JlIHRoYW4gMnggKGxvZzIoRkMpPj0xIG9yIC0xKQ0KY2hhbmdpbmcgPC0gKHNpZ24oZnVsbF90b3BfdGFibGUkRkMpKmxvZzIoYWJzKGZ1bGxfdG9wX3RhYmxlJEZDKSkgPiAxIHwgKHNpZ24oZnVsbF90b3BfdGFibGUkRkMpKmxvZzIoYWJzKGZ1bGxfdG9wX3RhYmxlJEZDKSkpIDwgLTEpDQoNCg0KI2dlbmVzIHRoYXQgYXJlIG5laXRoZXIgc2lnbmlmaWNhbnQgbm9yIGNoYW5naW5nDQpuZWl0aGVyIDwtICFzaWduaWZpY2FudCAmICFjaGFuZ2luZw0KI2dlbmVzIHRoYXQgYXJlIGNoYW5naW5nIGJ1dCBub3Qgc2lnbmlmaWNhbnQNCm5vdHNpZ25pZmljYW50X2hpZ2ggPC0gIXNpZ25pZmljYW50ICYgY2hhbmdpbmcNCiNnZW5lcyB0aGF0IGFyZSBzaWduaWZpY2FudCBidXQgbm90IGNoYW5naW5nDQpzaWduaWZpY2FudF9sb3cgPC0gc2lnbmlmaWNhbnQgJiAhY2hhbmdpbmcNCiNmaW5kIGdlbmVzIHRoYXQgYXJlIGJvdGggc2lnbmlmaWNhbnQgYW5kIGNoYW5naW5nDQpib3RoIDwtIHNpZ25pZmljYW50ICYgY2hhbmdpbmcNCmBgYA0KDQpgYGB7ciwgZWNobz1GQUxTRX0NCiNhZGp1c3QgY29uZmlkZW5jZSBpbnRlcnZhbHMgaWYgd2UgYXJlIHRvIG9ubHkgc2VsZWN0IGEgc3Vic2V0IG9mIGdlbmVzIChpbiBvdXIgY2FzZSwgc2lnbmlmaWNhbnQgZ2VuZXMpDQojc2VlIGh0dHBzOi8vbW9uYXNoYmlvaW5mb3JtYXRpY3NwbGF0Zm9ybS5naXRodWIuaW8vci1saW5lYXItYWJhY2JzMjAxOC90b3BpY3MvbGluZWFyX21vZGVsc19hYmFjYnMyMDE4Lmh0bWwNCiNmaW5kIGdlbmVzIHdoaWNoIHdlIGNvbnNpZGVyICJzZWxlY3RlZCIgKHNpZ25pZmljYW50LCBvciBzaWduaWZpY2FudCBBTkQgbG9nMiBjaGFuZ2luZykNCg0KcHJvcF9ib3RoIDwtIG1lYW4oY2hhbmdpbmcpICMic2lnbmlmaWNhbnQgaXMgYSAwLzEgYm9vbGVhbiBzbyB0aGUgbWVhbiBpcyB0aGUgcHJvcG9ydGlvbiANCiNkb3VibGUgY2hlY2sgaGVyZSBvbiB3aHkgdXNpbmcgbWVhbihib3RoKSBnaXZlcyBub24tc2lnbmlmaWNhbnQgQ0lzIHRob3VnaCB0aGUgYWRqLnAudmFsdWUgaXMgc2lnbmlmaWNhbnQuDQpmY3JfY29uZmludCA8LSAxIC0gMC4wNSpwcm9wX2JvdGgNCiNzbyBub3cgcmVwbGFjZSB0aGUgY29uZmlkZW5jZSBpbnRlcnZhbCB2YWx1ZXMNCg0KZnVsbF90b3BfdGFibGUgPC0gdG9wVGFibGUoZml0X3Jlc3VsdHNfY29udHJhc3RlZCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICBzb3J0LmJ5ID0gImxvZ0ZDIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICBuID0gSW5mLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkanVzdC5tZXRob2Q9IkJIIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpbnQ9ZmNyX2NvbmZpbnQsICN0aGVzZSBhcmUgbm93IGFkanVzdGVkLCB3aGVuIHdlIGFyZSBqdXN0IGNvbnNpZGVyaW5nIHRoZSBzaWduaWZpY2FudCBnZW5lcw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgI3AudmFsdWU9MC4wNQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgKQ0KDQojb25seSBrZWVwIHJvdyBwYXN0IHAudmFsdWUgdGhyZXNob2xkDQojdG9wLnRhYmxlIDwtIHRvcC50YWJsZVt0b3AudGFibGUkYWRqLlAuVmFsIDw9IDAuNSwgXQ0KI2NyZWF0ZSBjb2x1bW4gdGhhdCBzaG93cyBsb2dGb2xkQ2hhbmdlIGFzIHRoZSBGb2xkIENoYW5nZQ0KZnVsbF90b3BfdGFibGVbIkZDIl0gPC0gc2lnbihmdWxsX3RvcF90YWJsZVsibG9nRkMiXSkqMl5hYnMoZnVsbF90b3BfdGFibGVbImxvZ0ZDIl0pDQoNCg0KI29ubHkga2VlcCBjb2x1bW5zIHdlIGFyZSBpbnRlcmVzdGVkIGluDQp0b3BfdGFibGUgPC0gZnVsbF90b3BfdGFibGVbYygibG9nRkMiLCAiRkMiLCAiUC5WYWx1ZSIsImFkai5QLlZhbCIsImVudHJlel9JRCIsICJlbnNlbWJsX0lEIiwgIm1lcmdlZF9zeW1ib2wiLCJtZXJnZWRfZGVzY3JpcHRpb24iLCJlbnNlbWJsX2Rlc2NyaXB0aW9uIiwgIkF2ZUV4cHIiLCAiQ0kuTCIsICJDSS5SIiwidCIpXQ0KDQojcmVtb3ZlIHJvd25hbWVzIChub3cgcmVkdW5kYW50KQ0Kcm93bmFtZXModG9wX3RhYmxlKSA8LSBOVUxMDQoNCiNrYWJsZSh0b3BfdGFibGVbdG9wX3RhYmxlJGFkai5QLlZhbCA8PSAwLjA1LCBdWzE6MjAsMTo5XSwgY2FwdGlvbiA9ICJUb3AyMCBnZW5lcyBMaXZlciB2cyBBbGw7IGFkai5wIDwwLjA1OyByYW5rZWQgYnkgbG9nRkMiKSAjbm90ZSB0aGF0IHRoZSBjb25kaWZlbmNlIGludGVydmFscyBkaXNwbGF5ZWQgaGVyZSBhcmUgYWRqdXN0ZWQgZm9yIGp1ZGdpbmcgc2lnbmZpY2FudCBBTkQgMnhmb2xkIGNoYW5naW5nLCBub3QganVzdCBzaWduaWZpY2FudA0KIyBsaXN0IHRvcCBnZW5lcyB0aGF0IGFyZSBzaWduaWZpY2FudCBhbmQgbG9nZm9sZCAyWCBjaGFuZ2luZw0KI2thYmxlKHRvcF90YWJsZVt0b3BfdGFibGUkZW50cmV6X0lEICVpbiUgdG9wX3RhYmxlJGVudHJlel9JRFtib3RoXSwgXVsxOjIwLF0sIGNhcHRpb24gPSAiVG9wMjAgZ2VuZXMgQ1BGIHZzIERNU087IEZDPDEvMiBvciBGQz4yLCBhZGoucCA8MC4wNTsgcmFua2VkIGJ5IGxvZ0ZDIikNCiMgbGlzdCB0b3AgZ2VuZXMgaGlnaGVyIGluIExpdmVyDQoja2FibGUodG9wX3RhYmxlW3RvcF90YWJsZSRlbnRyZXpfSUQgJWluJSB0b3BfdGFibGUkZW50cmV6X0lEW2JvdGggJiB1cHJlZ3VsYXRlZF0sIF1bMToyMCxdLCBjYXB0aW9uID0gIlRvcDIwIGdlbmVzIHVwcmVndWxhdGVkIGdlbmVzIChDUEYpOyBGQz4yLCBhZGoucCA8MC4wNTsgcmFua2VkIGJ5IGxvZ0ZDIikNCg0KZm9ybWF0dGFibGUodG9wX3RhYmxlW3RvcF90YWJsZSRlbnRyZXpfSUQgJWluJSB0b3BfdGFibGUkZW50cmV6X0lEW2JvdGggJiB1cHJlZ3VsYXRlZF0sIF1bMToyMCxdLCANCiAgICAgICAgICAgICBjYXB0aW9uID0iVG9wMjAgZ2VuZXMgdXByZWd1bGF0ZWQgZ2VuZXMgKENQRik7IEZDPjIsIGFkai5wIDwwLjA1OyByYW5rZWQgYnkgbG9nRkMiLA0KICAgICAgICAgICAgI2FsaWduID1jKCJjIiwibCIsICJsIiwgImMiKSwgDQogICAgICAgICAgICBsaXN0KCNgZW50cmV6X0lEYCA9IGZvcm1hdHRlcigic3BhbiIsIA0KICAgICAgICAgICAgICAgICMgICAgICAgICAgICAgICAgICAgICAgc3R5bGUgPSB4IH4gc3R5bGUoDQogICAgICAgICAgICAgICAgIyAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yID0gIiNBOUE5QTkiLCBmb250LndlaWdodCA9ICJib2xkIikNCiAgICAgICAgICAgICAgICAjICAgICAgICAgICAgICAgICAgICAgICksIA0KICAgICAgICAgICAgICAgICBgbG9nRkNgPSBjb2xvcl90aWxlKE5BLCJkb2RnZXJibHVlIikNCg0KICAgICAgICAgICAgICAgICApDQogICAgICAgICAgICApDQoNCg0KIyBsaXN0IHRvcCBnZW5lcyBoaWdoZXIgaW4gR3V0IHR1YmUNCiNrYWJsZSh0b3BfdGFibGVbdG9wX3RhYmxlJGVudHJlel9JRCAlaW4lIHRvcF90YWJsZSRlbnRyZXpfSURbYm90aCAmIGRvd25yZWd1bGF0ZWRdLCBdWzE6MjAsXSwgY2FwdGlvbiA9ICJUb3AyMCBkb3ducmVndWxhdGVkIGdlbmVzIChDUEYpOyBGQzwxLzIsIGFkai5wIDwwLjA1OyByYW5rZWQgYnkgbG9nRkMiKQ0KDQoNCmZvcm1hdHRhYmxlKHRvcF90YWJsZVt0b3BfdGFibGUkZW50cmV6X0lEICVpbiUgdG9wX3RhYmxlJGVudHJlel9JRFtib3RoICYgZG93bnJlZ3VsYXRlZF0sIF1bMToyMCxdLCANCiAgICAgICAgICAgICBjYXB0aW9uID0iVG9wMjAgZG93bnJlZ3VsYXRlZCBnZW5lcyAoQ1BGKTsgRkM8MS8yLCBhZGoucCA8MC4wNTsgcmFua2VkIGJ5IGxvZ0ZDIiwNCiAgICAgICAgICAgICNhbGlnbiA9YygiYyIsImwiLCAibCIsICJjIiksIA0KICAgICAgICAgICAgbGlzdCgjYGVudHJlel9JRGAgPSBmb3JtYXR0ZXIoInNwYW4iLCANCiAgICAgICAgICAgICAgICAjICAgICAgICAgICAgICAgICAgICAgIHN0eWxlID0geCB+IHN0eWxlKA0KICAgICAgICAgICAgICAgICMgICAgICAgICAgICAgICAgICAgICAgICBjb2xvciA9ICIjQTlBOUE5IiwgZm9udC53ZWlnaHQgPSAiYm9sZCIpDQogICAgICAgICAgICAgICAgIyAgICAgICAgICAgICAgICAgICAgICApLCANCiAgICAgICAgICAgICAgICAgYGxvZ0ZDYD0gY29sb3JfdGlsZSgibGlnaHRjb3JhbCIsIE5BKQ0KDQogICAgICAgICAgICAgICAgICkNCiAgICAgICAgICAgICkNCg0KI3JlbW92ZSB1bnVzZWQgdmFyaWFibGVzDQpybShwcm9wX2JvdGgsIGZjcl9jb25maW50ICkNCmBgYA0KDQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KI3NhdmUgdXByZWd1bGF0ZWQgYW5kIGRvd25yZWd1bGF0ZWQgQ1BGIGdlbmVzDQpDUEZfdXByZWd1bGF0ZWQgPC0gdG9wX3RhYmxlW3RvcF90YWJsZSRlbnRyZXpfSUQgJWluJSB0b3BfdGFibGUkZW50cmV6X0lEW2JvdGggJiB1cHJlZ3VsYXRlZF0sIF1bLDVdDQpDUEZfZG93bnJlZ3VsYXRlZDwtIHRvcF90YWJsZVt0b3BfdGFibGUkZW50cmV6X0lEICVpbiUgdG9wX3RhYmxlJGVudHJlel9JRFtib3RoICYgZG93bnJlZ3VsYXRlZF0sIF1bLDVdDQojc2F2ZShDUEZfdXByZWd1bGF0ZWQsIGZpbGUgPSAiRDovL0FvY2VsbGFyaXNfQ1BGX01QSV9UMy9TYXZlZF9vYmplY3RzL0NQRl91cHJlZ3VsYXRlZF9nZW5lcy5yZHMiKQ0KI3NhdmUoQ1BGX2Rvd25yZWd1bGF0ZWQsIGZpbGUgPSAiRDovL0FvY2VsbGFyaXNfQ1BGX01QSV9UMy9TYXZlZF9vYmplY3RzL0NQRl9kb3ducmVndWxhdGVkX2dlbmVzLnJkcyIpDQpgYGANCg0KYGBge3IsIGVjaG89RkFMU0V9DQojc2F2ZSBDUEYgZ2VuZXMgd2l0aCBhIHNpZ25pZmljYW50IGNoYW5nZSAob2YgYW55IG1hZ25pdHVkZSkNCkNQRl9zaWduaWZpY2FudCA8LSAgdG9wX3RhYmxlW3RvcF90YWJsZSRlbnRyZXpfSUQgJWluJSB0b3BfdGFibGUkZW50cmV6X0lEW3NpZ25pZmljYW50XSwgXVssNV0NCiNzYXZlKENQRl9zaWduaWZpY2FudCwgZmlsZSA9ICJEOi8vQW9jZWxsYXJpc19DUEZfTVBJX1QzL1NhdmVkX29iamVjdHMvQ1BGX3NpZ25pZmljYW50X2dlbmVzLnJkcyIpDQpgYGANCg0KDQpgYGB7ciwgZWNobz1GQUxTRX0NCiNtYWtlIGEgZm9ybWF0dGFibGUgb2YgdGhlIERFIHVwcmVndWxhdGVkIGFuZCBkb3ducmVndWxhdGVkIGdlbmVzDQoNCiNkZWZpbmUgdGhlIGNvbmRpdGlvbmFsIGNvbG9yX3RpbGUgZnVuY3Rpb24NCmNvbG9yX3RpbGVfY29uZGl0aW9uYWwgPC0gZnVuY3Rpb24oZnVuPSJjb21tYSIsIGRpZ2l0cz0wLCBwYWxldHRlPSJSZEJ1Iiwgbj05KXsNCiAgZnVuIDwtIG1hdGNoLmZ1bihmdW4pDQogIHN0b3BpZm5vdChuID49NSkNCiAgcmV0dXJuX2N1dCA8LSBmdW5jdGlvbih5KQ0KICAgIGN1dCh5LCBicmVha3MgPSBxdWFudGlsZSh5LCBwcm9icyA9IDA6bi9uLCBuYS5ybSA9VCksDQogICAgICAgIGxhYmVscyA9IDE6biwgb3JkZXJlZF9yZXN1bHQgPSBULCBpbmNsdWRlLmxvd2VzdCA9VCkNCiAgDQogIHJldHVybl9jb2wgPC0gZnVuY3Rpb24oeSkNCiAgICBSQ29sb3JCcmV3ZXI6OmJyZXdlci5wYWwobiwgcGFsZXR0ZSlbYXMuaW50ZWdlcihyZXR1cm5fY3V0KHkpKV0NCiAgDQogIGZvcm1hdHRlcigic3BhbiIsIHggfiBmdW4oeCwgZGlnaXRzPSBkaWdpdHMpLA0KICAgICAgICAgICAgc3R5bGUgPSBmdW5jdGlvbih5KSBzdHlsZSgNCiAgICAgICAgICAgICAgZGlzcGxheSA9ICJibG9jayIsDQogICAgICAgICAgICAgIHBhZGRpbmcgPSAiMCA0cHgiLA0KICAgICAgICAgICAgICBgYm9yZGVyLXJhZGl1c2AgPSAiNHB4IiwNCiAgICAgICAgICAgICAgY29sb3IgPSBpZmVsc2UocmV0dXJuX2N1dCh5KSAlaW4lIGMoMSwgMiwgbi0xLCBuKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3NzY29sb3IoIndoaXRlIiksIGNzc2NvbG9yKCJibGFjayIpKSwNCiAgICAgICAgICAgICAgZm9udC53ZWlnaHQgPSBpZmVsc2UoeTw9LTEgfCB5Pj0xLCAiYm9sZCIsIE5BKSwNCiAgICAgICAgICAgICAgYGJhY2tncm91bmQtY29sb3JgID0gcmV0dXJuX2NvbCh5KQ0KICAgICAgICAgICAgKQ0KICAgICAgICAgICAgKQ0KfQ0KDQoNCmZvcm1hdHRhYmxlX291dHB1dCA8LSBmb3JtYXR0YWJsZSh0b3BfdGFibGVbdG9wX3RhYmxlJGVudHJlel9JRCAlaW4lIHRvcF90YWJsZSRlbnRyZXpfSURbc2lnbmlmaWNhbnRdLCBjKDEsMiw1LDcsOCwgNiw5LCA0KSBdLCANCiAgICAgICAgICAgICBjYXB0aW9uID0iREUgZ2VuZXM7IEZDPDEvMiBvciBGQz4yLCBhZGoucCA8MC4wNTsgcmFua2VkIGJ5IGxvZ0ZDIiwNCiAgICAgICAgICAgIGFsaWduID1jKCJjIiwiYyIsICJjIiwgImwiLCAibCIsICJsIiwgImwiLCAiYyIpLCANCiAgICAgICAgICAgIGxpc3QoYGVudHJlel9JRGAgPSBmb3JtYXR0ZXIoInNwYW4iLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGUgPSB4IH4gc3R5bGUoDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI2NvbG9yID0gIiNBOUE5QTkiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250LndlaWdodCA9ICJib2xkIikNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSwgDQogICAgICAgICAgICAgICAgIGFyZWEoY29sID0gNjo3KSB+IGZvcm1hdHRlcigic3BhbiIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZSA9IHggfiBzdHlsZSgNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yID0gIiNBOUE5QTkiKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLA0KICAgICAgICAgICAgICAgICBhcmVhKGNvbCA9MSkgfiBjb2xvcl90aWxlX2NvbmRpdGlvbmFsKGRpZ2l0cz0yKQ0KDQogICAgICAgICAgICAgICAgICkNCiAgICAgICAgICAgICkNCg0KZm9ybWF0dGFibGVfb3V0cHV0WzE6MjAsXQ0KYGBgDQoNCmBgYHtyLCBlY2hvPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQ0KI1RoZSB3aG9sZSB0YWJsZSBjYW4gYmUgc2F2ZWQgYXMgYW4gaHRtbCBvYmplY3QNCmZvcm1hdHRhYmxlX291dHB1dCA8LSBhcy5kYXRhdGFibGUoZm9ybWF0dGFibGVfb3V0cHV0LCBvcHRpb25zID0gbGlzdChwYWdlTGVuZ3RoID0gMTAwKSkgDQoNCiNzYXZlIHRvIHNoYXJlIGFuZCBmb3IgZXhwbG9yYXRpb24gDQojaHRtbCB3aWRnZXRzOjpzYXZlV2lkZ2V0KGZvcm1hdHRhYmxlX291dHB1dCwgIkM6Ly9Vc2Vycy9Eb2N0b3IvRGVza3RvcC9ERWdlbmVzX0NQRi5odG1sIiwgc2VsZmNvbnRhaW5lZCA9IFQpIA0KYGBgDQoNCg0KDQpgYGB7ciwgZWNobz1GQUxTRX0NCiNMZXQgdXMgcHJpbnQgYSBzdW1tYXJ5IHJlcHJlc2VudGF0aW9uIG9mIHRoZSBkaWZmZXJlbnRpYWxseSBleHByZXNzZWQgZ2VuZXMNCnBhc3RlMChzdW1tYXJ5KGNoYW5naW5nICYgc2lnbmlmaWNhbnQpWzNdICwiIGRpZmZlcmVudGlhbGx5IGV4cHJlc3NlZCBnZW5lcyAoUCA8MC4wNSwgRkM8MS8yIE9SIEZDPjIpOiIpDQpwYXN0ZTAoc3VtbWFyeShjaGFuZ2luZyAmIHVwcmVndWxhdGVkKVszXSAsIiBnZW5lcyB1cHJlZ3VsYXRlZCBieSBDUEYiKQ0KcGFzdGUwKHN1bW1hcnkoY2hhbmdpbmcgJiBkb3ducmVndWxhdGVkKVszXSAsIiBnZW5lcyBkb3ducmVndWxhdGVkIGJ5IENQRiIpDQpgYGANCmBgYHtyLCBlY2hvPUZBTFNFfQ0KI3RvIHVzZSB0aGlzIGFzIGEgcmVmZXJlbmNlIGZvciB0aGUgZ2VuZXMgc2lnbmFsZWQgb3V0IGZyb20gdGhlIHZlbm4gZGlhZ3JhbSwgc2F2ZSBhcyBvYmplY3QsDQp0b3BfdGFibGVfQ1BGIDwtIHRvcF90YWJsZQ0KI3NhdmUodG9wX3RhYmxlX0NQRiwgZmlsZSA9ICJEOi8vQW9jZWxsYXJpc19DUEZfTVBJX1QzL1NhdmVkX29iamVjdHMvdG9wX3RhYmxlX0NQRi5yZHMiKQ0KYGBgDQoNCmBgYHtyLCBlY2hvPUZBTFNFLCBmaWcud2lkdGg9NCwgZmlnLmhlaWdodD00fQ0KI2FuZCB0aGUgY29ycmVzcG9uZGluZyBwbG90DQoNCmdncGxvdCh0b3BfdGFibGUsIGFlcyh4PUF2ZUV4cHIsIHk9c2lnbihGQykqbG9nMihhYnMoRkMpKSkpICsgDQogIGdlb21fcG9pbnQoZGF0YT10b3BfdGFibGVbbmVpdGhlcixdLCBzaXplPTAuNSwgY29sb3I9ImdyYXk2MCIsIGFscGhhPTAuMSkgKw0KICBnZW9tX3BvaW50KGRhdGE9dG9wX3RhYmxlW25vdHNpZ25pZmljYW50X2hpZ2gsXSwgc2l6ZT0wLjgsIGNvbG9yPSJncmF5NjAiLCBhbHBoYT0wLjUpKw0KICBnZW9tX3BvaW50KGRhdGE9dG9wX3RhYmxlW3NpZ25pZmljYW50X2xvdyxdLCBzaXplPTAuOCwgY29sb3I9ImdyYXk0MCIsIGFscGhhPTAuNSkrDQogIGdlb21fcG9pbnQoZGF0YT10b3BfdGFibGVbYm90aCxdLCBzaXplPTEsIGNvbG9yPWlmZWxzZSh0b3BfdGFibGVbYm90aCwgImxvZ0ZDIl0+MCwibGlnaHRjb3JhbCIsImRvZGdlcmJsdWUyIiksIGFscGhhPTAuNSkrDQogIHRoZW1lX2J3KCkrdGhlbWUocGFuZWwuYm9yZGVyID0gZWxlbWVudF9yZWN0KGNvbG9yPSJsaWdodHNreWJsdWUiLCBmaWxsPU5BLCBsaW5ld2lkdGg9IDIpKSsNCiAgIHlsaW0oLTE1LDE1KSsNCiAgeWxhYigibG9nMihDUEYvRE1TTykiKSsNCiAgeGxhYigiQXZlcmFnZSBFeHByZXNzaW9uIikrIA0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQ9MSwgY29sb3IgPSAibGlnaHRjb3JhbCIsIGxpbmV3aWR0aD0wLjEpKyAjIGNhbiBhZGQgbGluZXR5cGU9ImRhc2hlZCINCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0PS0xLCBjb2xvciA9ICJkb2RnZXJibHVlMiIsIGxpbmV3aWR0aD0wLjEpKw0KICBnZ3RpdGxlKCcqKkNQRioqIHZzICoqRE1TTyoqJykrDQogIGxhYnMoc3VidGl0bGUgPSAnPHNwYW4gc3R5bGUgPSAiY29sb3I6bGlnaHRjb3JhbCI+IHVwcmVndWxhdGVkPC9zcGFuPiwgDQogICAgICAgPHNwYW4gc3R5bGUgPSAiY29sb3I6ZG9kZ2VyYmx1ZTIiPmRvd25yZWd1bGF0ZWQ8L3NwYW4+JykrDQogIHRoZW1lX2J3KCkrdGhlbWUocGFuZWwuYm9yZGVyID0gZWxlbWVudF9yZWN0KGNvbG9yPSJsaWdodHNreWJsdWUiLCBmaWxsPU5BLCBsaW5ld2lkdGg9IDIpLA0KICAgICAgICAgICAgICAgICAgIHBsb3QudGl0bGUgPSBnZ3RleHQ6OmVsZW1lbnRfbWFya2Rvd24oKSwNCiAgICAgICAgICAgICAgICAgICBwbG90LnN1YnRpdGxlID0gZ2d0ZXh0OjplbGVtZW50X21hcmtkb3duKCkpDQoNCmBgYA0KDQpgYGB7ciwgZWNobz1GQUxTRX0NCiNMZXQgdXMgcGxvdCB0aGUgcGF0dGVybiBvZiBleHByZXNzaW9uIG9mIGRpZmZlcmVudGlhbGx5IGV4cHJlc3NlZCBnZW5lcw0KI2xvYWQgdGhlIGNvdW50c19WU1Qgb2JqZWN0DQpsb2FkKCJEOi8vQW9jZWxsYXJpc19DUEZfTVBJX1QzL1NhdmVkX29iamVjdHMvY291bnRzX1ZTVC5yZHMiKQ0KYGBgDQoNCmBgYHtyLCBlY2hvPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQ0KI3RvIGFkZCB0aGUgY29ycmVsYXRpb24gdmFsdWVzIHdpdGggVDMgYW5kIE1QSSBjb25kaXRpb25zLCBsZXQgdXMgbWFrZSBhIHRhYmxlDQoNCg0KI2NhbGN1bGF0ZSB6LXNjb3JlDQpjb3VudHNfVlNUX3ogPC0gdChzY2FsZSh0KGNvdW50c19WU1QpKSkNCg0KI2NyZWF0ZSBjb3VudHMgdGFibGUgd2l0aCBhdmVyYWdlIHZhbHVlcw0KZ3JvdXBfaW5kZWNlcyA8LSBjKDAsIGN1bXN1bSh1bm5hbWUoIHRhYmxlKHNhbXBsZV9tZXRhZGF0YSR0cmVhdG1lbnQpKSkpDQoNCmNvdW50c19WU1RfYXZlcmFnZWQgPC0gZGF0YS5mcmFtZShtYXRyaXgobnJvdz1ucm93KGNvdW50c19WU1RfeiksbmNvbD0wKSkNCg0KI2NhbGN1bGF0ZSB0aGUgYXZlcmFnZSBieSBncm91cCBvZiByZXBsaWNhdGVzDQoNCmZvciAoaSBpbiBzZXEoMToobGVuZ3RoKGdyb3VwX2luZGVjZXMpLTEpKSkgew0KICB0bXAgPC0gY291bnRzX1ZTVF96WywoZ3JvdXBfaW5kZWNlc1tpXSsxKTpncm91cF9pbmRlY2VzW2krMV1dDQogIHRtcF9hdmVyYWdlcyA8LSByb3dNZWFucyh0bXApDQogIGNvdW50c19WU1RfYXZlcmFnZWQgPC0gY2JpbmQoY291bnRzX1ZTVF9hdmVyYWdlZCwgdG1wX2F2ZXJhZ2VzKQ0KfQ0KDQpjb2xuYW1lcyhjb3VudHNfVlNUX2F2ZXJhZ2VkKSA8LSB1bmlxdWUoc2FtcGxlX21ldGFkYXRhJHRyZWF0bWVudCkNCg0KY29ycl9kZiA8LSBhcy5kYXRhLmZyYW1lKHJvd25hbWVzKGNvdW50c19WU1RfYXZlcmFnZWQpKQ0KbmFtZXMoY29ycl9kZikgPC0gImdlbmVfaWQiDQpoZWFkKGNvcnJfZGYpDQoNCmNvcnJfZGYkZGVsdGFUMyA8LSBhYnMoY291bnRzX1ZTVF9hdmVyYWdlZFssIkNQRiJdLWNvdW50c19WU1RfYXZlcmFnZWRbLCJUM0lPUCJdKSANCmNvcnJfZGYkZGVsdGFNUEkgPC0gYWJzKGNvdW50c19WU1RfYXZlcmFnZWRbLCJDUEYiXS1jb3VudHNfVlNUX2F2ZXJhZ2VkWywiTVBJIl0pIA0KY29ycl9kZiRzaW1pbGFyaXR5IDwtIE5BDQpoZWFkKGNvcnJfZGYpDQoNCmZvciAoaSBpbiBzZXEoMTpucm93KGNvcnJfZGYpKSkgew0KICBpZiAoYWJzKGNvcnJfZGYkZGVsdGFUM1tpXSk8IGFicyhjb3JyX2RmJGRlbHRhTVBJW2ldKSkgew0KICAgIGNvcnJfZGYkc2ltaWxhcml0eVtpXSA8LSAiVDMiDQogICAgDQogIH0NCiAgDQogIGVsc2Ugew0KICAgIGNvcnJfZGYkc2ltaWxhcml0eVtpXSA8LSAiTVBJIg0KICAgIA0KICB9DQogIA0KICAjaWYgdGhlIGNsb3Nlc3QgdHJlYXRtZW50IGlzIG1vcmUgdGhhbiAxc2lnbm1hIGF3YXksIENQRiBpcyBub3Qgc2ltaWxhciB0byBpdCAoYW5kIHNvIGV2ZW4gbGVzcyB0byB0aGUgb3RoZXIgb25lKSwgaXQncyBhIHVuaXF1ZSByZXNwb25zZQ0KICBpZiAobWluKGNvcnJfZGYkZGVsdGFUM1tpXSwgY29ycl9kZiRkZWx0YU1QSVtpXSkgPjEpIHsNCiAgICBjb3JyX2RmJHNpbWlsYXJpdHlbaV0gPC0gIm5laXRoZXIiDQogICAgDQogIH0NCiAgDQogICNpZiBib3RoIG90aGVyIHRyZWF0bWVudHMgYXJlIHdpdGhpbiAxIHNpZ21hLCBDUEYgaXMgaW4gZmFjdCBzaW1pbGFyIHRvIGJvdGggdHJlYXRtZW50cw0KICBpZiAoKGNvcnJfZGYkZGVsdGFUM1tpXSA8MSkgJiAoY29ycl9kZiRkZWx0YU1QSVtpXSA8MSkpIHsNCiAgICBjb3JyX2RmJHNpbWlsYXJpdHlbaV0gPC0gImJvdGgiDQogICAgDQogIH0NCiAgDQp9DQoNCnJvd25hbWVzKGNvcnJfZGYpIDwtIGNvcnJfZGYkZ2VuZV9pZA0KY29ycl9kZiA8LSBjb3JyX2RmWywyOjRdDQpoZWFkKGNvcnJfZGYpDQoNCnJvd25hbWVzKGNvcnJfZGYpIDwtIGFubm90YXRpb25faW5mbyRtZXJnZWRfZGVzY3JpcHRpb25bbWF0Y2gocm93bmFtZXMoY29ycl9kZiksIGFubm90YXRpb25faW5mbyRlbnRyZXpfSUQpXQ0KDQpoZWFkKGNvcnJfZGYpDQpgYGANCg0KDQpgYGB7ciwgZWNobz1GQUxTRSwgaW5jbHVkZT1GQUxTRX0NCnNlbGVjdGVkX2dlbmVzIDwtIHRvcF90YWJsZVt0b3BfdGFibGUkZW50cmV6X0lEICVpbiUgdG9wX3RhYmxlJGVudHJlel9JRFtib3RoICYgdXByZWd1bGF0ZWRdLCBdWzE6YXMubnVtZXJpYyhzdW1tYXJ5KGNoYW5naW5nICYgdXByZWd1bGF0ZWQpWzNdKSwiZW50cmV6X0lEIl0NCiNzZWxlY3RlZF9nZW5lcyA8LSB0b3BfdGFibGVbdG9wX3RhYmxlJGVudHJlel9JRCAlaW4lIHRvcF90YWJsZSRlbnRyZXpfSURbYm90aCAmIHVwcmVndWxhdGVkXSwgXVsxOjUwLCJlbnRyZXpfSUQiXQ0KDQojIFJldHVybnMgdGhlIG1pc3NpbmcgZ2VuZXM6DQptaXNzaW5nX2dlbmVzIDwtIGFzLmRhdGEuZnJhbWUoc2V0ZGlmZihzZWxlY3RlZF9nZW5lcywgcm93Lm5hbWVzKGNvdW50c19WU1QpKSkNCmNvbG5hbWVzKG1pc3NpbmdfZ2VuZXMpIDwtICJlbnRyZXpfSUQiDQptaXNzaW5nX2dlbmVzJGRlc2NyaXB0aW9uIDwtIGFubm90YXRpb25faW5mbyRtZXJnZWRfZGVzY3JpcHRpb25bbWF0Y2gobWlzc2luZ19nZW5lcyRlbnRyZXpfSUQsYW5ub3RhdGlvbl9pbmZvJGVudHJlel9JRCldDQoNCg0KIyBSZXR1cm5zIHRoZSBleGlzdGluZyBnZW5lczoNCnNlbGVjdGVkX2dlbmVzIDwtIGFzLmRhdGEuZnJhbWUoaW50ZXJzZWN0KHNlbGVjdGVkX2dlbmVzLCByb3cubmFtZXMoY291bnRzX1ZTVCkpKQ0KY29sbmFtZXMoc2VsZWN0ZWRfZ2VuZXMpIDwtICJlbnRyZXpfSUQiDQpzZWxlY3RlZF9nZW5lcyRkZXNjcmlwdGlvbiA8LSBhbm5vdGF0aW9uX2luZm8kbWVyZ2VkX2Rlc2NyaXB0aW9uW21hdGNoKHNlbGVjdGVkX2dlbmVzJGVudHJlel9JRCxhbm5vdGF0aW9uX2luZm8kZW50cmV6X0lEKV0NCg0KDQojcHJpbnQgbGlzdCBvZiBkaWNhcmRlZCBnZW5lcyAoYmVjYXVzZSBtaXNzaW5nKSBhbmQgb2YgcmV0YWluZWQgZ2VuZXMgKGN1cmF0ZWQgZGlnZXN0aW9uIGdlbmVzLCBwcmVzZW50IGluIHRoZSBkYXRhc2V0KQ0KDQprYWJsZShtaXNzaW5nX2dlbmVzLCBjYXB0aW9uID0gIkdlbmVzIG1pc3NpbmcgZnJvbSB0aGUgZGF0YXNldCAoaWdub3JlZCkiKQ0Ka2FibGUoc2VsZWN0ZWRfZ2VuZXMsIGNhcHRpb24gPSAiR2VuZXMgcmV0YWluZWQiKQ0KDQoNCiMjIHN1YnNldCB0aGUgb3JpZ2luYWwgVlNUIG9iamVjdCB0byBvbmx5IGtlZXAgc2VsZWN0ZWQgZ2VuZXMNCmNvdW50c19WU1Rfc2VsZWN0ZWRnZW5lcyA8LSBzdWJzZXQoY291bnRzX1ZTVCwgcm93bmFtZXMoY291bnRzX1ZTVCkgJWluJSBzZWxlY3RlZF9nZW5lcyRlbnRyZXpfSUQpDQoNCiMjIENyZWF0ZSBVbmlxdWUgQ29sdW1uIE5hbWVzDQojcm93bmFtZXMoY291bnRzX1ZTVF9zZWxlY3RlZGdlbmVzKSA8LSBkcGx5cjo6cmVjb2RlKA0KIyAgcm93bmFtZXMoY291bnRzX1ZTVF9zZWxlY3RlZGdlbmVzKSwgDQojICAhISFzZXROYW1lcyhtYWtlLnVuaXF1ZShhcy5jaGFyYWN0ZXIoYW5ub3RhdGlvbl9pbmZvJGRlc2NyaXB0aW9uKSksICMgY29sdW1uIG9mIGRpY3Rpb25hcnkgdGFibGUgdGhhdCBoYXMgTkVXIG5hbWVzDQojICAgICAgICAgICAgICBhbm5vdGF0aW9uX2luZm8kZW5zZW1ibF9nZW5lX2lkKSAgI2NvbHVtbiBvZiBkaWN0aW9uYXJ5IHRhYmxlIHdpdGggT0xEIG5hbWVzDQojICApDQoNCnJvd25hbWVzKGNvdW50c19WU1Rfc2VsZWN0ZWRnZW5lcykgPC0gYW5ub3RhdGlvbl9pbmZvJG1lcmdlZF9kZXNjcmlwdGlvblttYXRjaChyb3duYW1lcyhjb3VudHNfVlNUX3NlbGVjdGVkZ2VuZXMpLCBhbm5vdGF0aW9uX2luZm8kZW50cmV6X0lEKV0NCg0KDQojcmVtb3ZlIHVudXNlZCB2YXJpYWJsZXMNCiNybShtaXNzaW5nX2dlbmVzKQ0KYGBgDQoNCmBgYHtyLCBmaWcuaGVpZ2h0PTUsIGZpZy53aWR0aD0xNSwgZWNobz1GQUxTRX0NCg0KIyNkZWZpbmUgdGhlIGNvbG9ycyBmb3IgdGhlIGhlYXRtYXAgKGNhdGVnb3JpY2FsKTogMSBjb2xvciBmb3IgZWFjaCBzbWFsbGVzdCBleHBlcmltZW50YWwgdW5pdCB0aGF0IGlzIGJlaW5nICBjb21wYXJlZDsgaS5lLiBoZXJlIHRoZSB0cmVhdG1lbnQNCmNvbG9yX2NhdGVnb3JpY2FsX2hlYXRtYXAgPC0gY29sb3JfY2F0ZWdvcmljYWxfdHJlYXRtZW50DQojbmFtZSB0aGlzIGxpc3Qgb2YgY29sb3Igd2l0aCB0aGUgY29ycmVzcG9uZGluZyBuYW1lcyAobm90ZTogdGhlc2UgYXJlIHRoZSB1bmlxdWUgdmFsdWVzIGZvciB0aGF0IGNhdGVnb3J5IGluIHRoZSBzYW1wbGUgbWV0YWRhdGEpDQpjb2xvcl9jYXRlZ29yaWNhbF9oZWF0bWFwX25hbWVkIDwtIGNvbG9yX2NhdGVnb3JpY2FsX2hlYXRtYXANCm5hbWVzKGNvbG9yX2NhdGVnb3JpY2FsX2hlYXRtYXBfbmFtZWQpIDwtIHVuaXF1ZShzYW1wbGVfbWV0YWRhdGEkdHJlYXRtZW50KQ0KDQojbG9hZCB0aGlzIGluZm9ybWF0aW9uIGludG8gdGhlIGhlYXRtYXANCmNvbEFubiA8LSBIZWF0bWFwQW5ub3RhdGlvbigjZGYgPSBkYXRhLmZyYW1lKHRyZWF0bWVudCA9IHNhbXBsZV9tZXRhZGF0YSR0cmVhdG1lbnQpLCAjdGhlIG5hbWUgb2YgdGhlIGNvbHVtbiBuZWVkcyB0byBtYXRjaCB0aGUgbmFtZSBvZiB0aGUgbmFtZWQgbGlzdA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICNjb2wgPSBsaXN0KCJ0cmVhdG1lbnQiID0gY29sb3JfY2F0ZWdvcmljYWxfaGVhdG1hcF9uYW1lZCksICNzZXQgdGhlIG5hbWUgb2YgdGhlIG5hbWVkIGxpc3Qgc28gaXQgbWF0Y2hlcw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICNhbm5vdGF0aW9uX3dpZHRoID0gdW5pdChjKDEsIDQpLCAnY20nKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjZ2FwID0gdW5pdCgxLCAnbW0nKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3dfbGVnZW5kID0gRkFMU0UsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd19hbm5vdGF0aW9uX25hbWUgPSBGQUxTRSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGljaCA9ICdjb2wnLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICNhbHNvIGNyZWF0ZSBhbiBlbXB0eSByb3cgYWJvZSB0aGUgaGVhdG1hcCwgdG8gZGlzcGxheSBhZGRpdGlvbmFsIGluZm8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbXB0eTEgPSBhbm5vX2VtcHR5KGJvcmRlciA9IEZBTFNFLCBoZWlnaHQ9IHVuaXQoOCwgIm1tIikpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKQ0KDQoNCnNpbWlsYXJpdHlfbGlzdF9uYW1lZCA8LSBjKCJwYWxlZ3JlZW4zIiwgImxpZ2h0Y29yYWwiLCAiZ3JheTgwIiwgIndoaXRlIikNCm5hbWVzKHNpbWlsYXJpdHlfbGlzdF9uYW1lZCkgPC0gYygiVDMiLCAiTVBJIiwgIm5laXRoZXIiLCAiYm90aCIpDQoNCmhhID0gcm93QW5ub3RhdGlvbihkZiA9IGRhdGEuZnJhbWUodHJlYXRtZW50ID0gY29ycl9kZltyb3duYW1lcyhjb3JyX2RmKSAlaW4lIHJvd25hbWVzKGNvdW50c19WU1Rfc2VsZWN0ZWRnZW5lcyksInNpbWlsYXJpdHkiXSksICN0aGUgbmFtZSBvZiB0aGUgY29sdW1uIG5lZWRzIHRvIG1hdGNoIHRoZSBuYW1lIG9mIHRoZSBuYW1lZCBsaXN0DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sID0gbGlzdCgidHJlYXRtZW50IiA9IHNpbWlsYXJpdHlfbGlzdF9uYW1lZCksICNzZXQgdGhlIG5hbWUgb2YgdGhlIG5hbWVkIGxpc3Qgc28gaXQgbWF0Y2hlcw0KICAgICAgICAgICAgICAgICAgIHNpbXBsZV9hbm5vX3NpemUgPSB1bml0KDIsICJjbSIpLA0KICAgICAgICAgICAgICAgICAgIGVtcHR5MiA9IGFubm9fZW1wdHkoYm9yZGVyID0gRkFMU0UsIHdpZHRoPSB1bml0KDgsICJtbSIpKQ0KICAgICAgICAgICAgICAgICAgICkNCg0KDQpIZWF0bWFwKG1hdCA9IHQoc2NhbGUodChjb3VudHNfVlNUX3NlbGVjdGVkZ2VuZXMpKSksDQogICAgICAgIG5hbWU9ICJ6LXNjb3JlIiwNCiAgICAgICAgI2NvbHVtbl90aXRsZSA9IGd0X3JlbmRlcigNCiAgICAgICAgIyAgIlBhdHRlcm4gb2YgZXhwcmVzc2lvbiAoYXMgPHNwYW4gc3R5bGU9J2NvbG9yOmJyb3duMic+Kip6LXNjb3JlcyoqPC9zcGFuPikgPGJyLz4gb2YgQ1BGLXVwcmVndWxhdGVkIGdlbmVzIg0KICAgICAgICAjICApLA0KICAgICAgICBjb2wgPSByZXYoYnJld2VyLnBhbCgxMSwiUmRCdSIpKSwNCiAgICAgICAgbmFfY29sID0gImJsYWNrIiwNCiAgICAgICAgY2x1c3Rlcl9yb3dzID0gVCwNCiAgICAgICAgc2hvd19yb3dfZGVuZCA9IFQsDQogICAgICAgICNyb3dfb3JkZXIgPSBvcmRlcmVkX2xldmVscywNCiAgICAgICAgY2x1c3Rlcl9jb2x1bW5zID0gRkFMU0UsDQogICAgICAgIHNob3dfY29sdW1uX2RlbmQgPSBGQUxTRSwNCiAgICAgICAgI2NvbHVtbl9vcmRlciA9IG9yZGVyZWRfbGV2ZWxzLA0KICAgICAgICAjcm93X3NwbGl0ID0gZmFjdG9yKHBhc3RlMChzYW1wbGVfbWV0YWRhdGEkc2VnbWVudCwgc2FtcGxlX21ldGFkYXRhJHN0YWdlKSwgbGV2ZWxzID0gYygibGl2ZXJTMSIsICJsaXZlclM0IiwgImxpdmVyUzciLCAic3RvbWFjaFMxIiwgImludGVzdGluZVMxIiwgInN0b21hY2hTNCIsICJBX2ludGVzdGluZVM0IiwgIlBfaW50ZXN0aW5lUzQiLCAic3RvbWFjaFM3IiwgIkFfaW50ZXN0aW5lUzciLCAiUF9pbnRlc3RpbmVTNyIpKSwNCiAgICAgICAgY29sdW1uX3NwbGl0ID0gZmFjdG9yKHNhbXBsZV9tZXRhZGF0YSR0cmVhdG1lbnQsIGxldmVscyA9IGMoIkRNU08iLCAiVDNJT1AiLCAiTVBJIiwgIkNQRiIsICJDUEYuVDNJT1AiKSksDQogICAgICAgICNjbHVzdGVyX3Jvd19zbGljZXMgPSBGQUxTRSwNCiAgICAgICAgY2x1c3Rlcl9jb2x1bW5fc2xpY2VzID0gRkFMU0UsDQogICAgICAgIHJvd190aXRsZSA9IE5VTEwsDQogICAgICAgIHJvd19nYXAgPSB1bml0KDAuNSwgIm1tIiksDQogICAgICAgIGNvbHVtbl9nYXAgPSB1bml0KGMocmVwKDEwLDEpLCByZXAoMiwzKSksICJtbSIpLA0KICAgICAgICAjd2lkdGggPSB1bml0KDgsICJjbSIpLCANCiAgICAgICAgI2hlaWdodCA9IHVuaXQoOCwgImNtIiksDQogICAgICAgIGNvbHVtbl9uYW1lc19ncCA9IGdyaWQ6OmdwYXIoZm9udHNpemUgPSA4KSwNCiAgICAgICAgcm93X25hbWVzX2dwID0gZ3JpZDo6Z3Bhcihmb250c2l6ZSA9IDgpLA0KICAgICAgICB0b3BfYW5ub3RhdGlvbiA9IGNvbEFubiwNCiAgICAgICAgcmlnaHRfYW5ub3RhdGlvbiA9IGhhLA0KICAgICAgICBzaG93X3Jvd19uYW1lcyA9IEZBTFNFLA0KICAgICAgICBzaG93X2NvbHVtbl9uYW1lcyA9IEZBTFNFLA0KICAgICAgICBzaG93X2hlYXRtYXBfbGVnZW5kID0gRiwNCiAgICAgICAgYm9yZGVyID0gVFJVRSwNCiAgICAgICAgY2x1c3RlcmluZ19tZXRob2Rfcm93cyA9ICd3YXJkLkQyJw0KICAgICAgICAjdXNlX3Jhc3RlciA9IFRSVUUsIHJhc3Rlcl9tYWdpY2tfZmlsdGVyID0gIkdhdXNzaWFuIg0KICAgICAgICApDQoNCg0KbGlicmFyeShHZXRvcHRMb25nKSAgIyBmb3IgdGhlIGZ1bmN0aW9uIHFxKCkNCmdyb3VwX2Jsb2NrX2Fubm8gPSBmdW5jdGlvbihncm91cCwgZW1wdHlfYW5ubywgZ3AgPSBncGFyKCksIA0KICAgIGxhYmVsID0gTlVMTCwgbGFiZWxfZ3AgPSBncGFyKCkpIHsNCg0KICAgIHNlZWtWaWV3cG9ydChxcSgiYW5ub3RhdGlvbl9Ae2VtcHR5X2Fubm99X0B7bWluKGdyb3VwKX0iKSkNCiAgICBsb2MxID0gZGV2aWNlTG9jKHggPSB1bml0KDAsICJucGMiKSwgeSA9IHVuaXQoMCwgIm5wYyIpKQ0KICAgIHNlZWtWaWV3cG9ydChxcSgiYW5ub3RhdGlvbl9Ae2VtcHR5X2Fubm99X0B7bWF4KGdyb3VwKX0iKSkNCiAgICBsb2MyID0gZGV2aWNlTG9jKHggPSB1bml0KDEsICJucGMiKSwgeSA9IHVuaXQoMSwgIm5wYyIpKQ0KDQogICAgc2Vla1ZpZXdwb3J0KCJnbG9iYWwiKQ0KICAgIGdyaWQucmVjdChsb2MxJHgsIGxvYzEkeSwgd2lkdGggPSBsb2MyJHggLSBsb2MxJHgsIGhlaWdodCA9IGxvYzIkeSAtIGxvYzEkeSwgDQogICAgICAgIGp1c3QgPSBjKCJsZWZ0IiwgImJvdHRvbSIpLCBncCA9IGdwKQ0KICAgIGlmKCFpcy5udWxsKGxhYmVsKSkgew0KICAgICAgICBncmlkLnRleHQobGFiZWwsIHggPSAobG9jMSR4ICsgbG9jMiR4KSowLjUsIHkgPSAobG9jMSR5ICsgbG9jMiR5KSowLjUsIGdwID0gbGFiZWxfZ3ApDQogICAgfQ0KfQ0KDQpncm91cF9ibG9ja19hbm5vKDE6MSwgImVtcHR5MSIsIGdwID0gZ3BhcihmaWxsID0gImdyYXk3MCIpLCBsYWJlbCA9ICJETVNPIikNCmdyb3VwX2Jsb2NrX2Fubm8oMjoyLCAiZW1wdHkxIiwgZ3AgPSBncGFyKGZpbGwgPSAicGFsZWdyZWVuMyIpLCBsYWJlbCA9ICJUMytJT1AiKQ0KZ3JvdXBfYmxvY2tfYW5ubygzOjMsICJlbXB0eTEiLCBncCA9IGdwYXIoZmlsbCA9ICJsaWdodGNvcmFsIiksIGxhYmVsID0gIk1QSSIpDQpncm91cF9ibG9ja19hbm5vKDQ6NCwgImVtcHR5MSIsIGdwID0gZ3BhcihmaWxsID0gImxpZ2h0c2t5Ymx1ZSIpLCBsYWJlbCA9ICJDUEYiKQ0KZ3JvdXBfYmxvY2tfYW5ubyg1OjUsICJlbXB0eTEiLCBncCA9IGdwYXIoZmlsbCA9ICJvcmNoaWQyIiksIGxhYmVsID0gIkNQRitUMytJT1AiKQ0KDQoNCmBgYA0KDQoNCmBgYHtyLCBlY2hvPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQ0KbG9hZCgiRDovL0FvY2VsbGFyaXNfQ1BGX01QSV9UMy9TYXZlZF9vYmplY3RzL2NvdW50c19WU1QucmRzIikNCnNlbGVjdGVkX2dlbmVzIDwtIHRvcF90YWJsZVt0b3BfdGFibGUkZW50cmV6X0lEICVpbiUgdG9wX3RhYmxlJGVudHJlel9JRFtib3RoICYgZG93bnJlZ3VsYXRlZF0sIF1bMTphcy5udW1lcmljKHN1bW1hcnkoY2hhbmdpbmcgJiBkb3ducmVndWxhdGVkKVszXSksImVudHJlel9JRCJdDQojc2VsZWN0ZWRfZ2VuZXMgPC0gdG9wX3RhYmxlW3RvcF90YWJsZSRlbnRyZXpfSUQgJWluJSB0b3BfdGFibGUkZW50cmV6X0lEW2JvdGggJiBkb3ducmVndWxhdGVkXSwgXVsxOjUwLCJlbnRyZXpfSUQiXQ0KDQojIFJldHVybnMgdGhlIG1pc3NpbmcgZ2VuZXM6DQptaXNzaW5nX2dlbmVzIDwtIGFzLmRhdGEuZnJhbWUoc2V0ZGlmZihzZWxlY3RlZF9nZW5lcywgcm93Lm5hbWVzKGNvdW50c19WU1QpKSkNCmNvbG5hbWVzKG1pc3NpbmdfZ2VuZXMpIDwtICJlbnRyZXpfSUQiDQptaXNzaW5nX2dlbmVzJGRlc2NyaXB0aW9uIDwtIGFubm90YXRpb25faW5mbyRtZXJnZWRfZGVzY3JpcHRpb25bbWF0Y2gobWlzc2luZ19nZW5lcyRlbnRyZXpfSUQsYW5ub3RhdGlvbl9pbmZvJGVudHJlel9JRCldDQoNCg0KIyBSZXR1cm5zIHRoZSBleGlzdGluZyBnZW5lczoNCnNlbGVjdGVkX2dlbmVzIDwtIGFzLmRhdGEuZnJhbWUoaW50ZXJzZWN0KHNlbGVjdGVkX2dlbmVzLCByb3cubmFtZXMoY291bnRzX1ZTVCkpKQ0KY29sbmFtZXMoc2VsZWN0ZWRfZ2VuZXMpIDwtICJlbnRyZXpfSUQiDQpzZWxlY3RlZF9nZW5lcyRkZXNjcmlwdGlvbiA8LSBhbm5vdGF0aW9uX2luZm8kbWVyZ2VkX2Rlc2NyaXB0aW9uW21hdGNoKHNlbGVjdGVkX2dlbmVzJGVudHJlel9JRCxhbm5vdGF0aW9uX2luZm8kZW50cmV6X0lEKV0NCg0KDQojcHJpbnQgbGlzdCBvZiBkaWNhcmRlZCBnZW5lcyAoYmVjYXVzZSBtaXNzaW5nKSBhbmQgb2YgcmV0YWluZWQgZ2VuZXMgKGN1cmF0ZWQgZGlnZXN0aW9uIGdlbmVzLCBwcmVzZW50IGluIHRoZSBkYXRhc2V0KQ0KDQprYWJsZShtaXNzaW5nX2dlbmVzLCBjYXB0aW9uID0gIkdlbmVzIG1pc3NpbmcgZnJvbSB0aGUgZGF0YXNldCAoaWdub3JlZCkiKQ0Ka2FibGUoc2VsZWN0ZWRfZ2VuZXMsIGNhcHRpb24gPSAiR2VuZXMgcmV0YWluZWQiKQ0KDQoNCiMjIHN1YnNldCB0aGUgb3JpZ2luYWwgVlNUIG9iamVjdCB0byBvbmx5IGtlZXAgc2VsZWN0ZWQgZ2VuZXMNCmNvdW50c19WU1Rfc2VsZWN0ZWRnZW5lcyA8LSBzdWJzZXQoY291bnRzX1ZTVCwgcm93bmFtZXMoY291bnRzX1ZTVCkgJWluJSBzZWxlY3RlZF9nZW5lcyRlbnRyZXpfSUQpDQoNCiMjIENyZWF0ZSBVbmlxdWUgQ29sdW1uIE5hbWVzDQojcm93bmFtZXMoY291bnRzX1ZTVF9zZWxlY3RlZGdlbmVzKSA8LSBkcGx5cjo6cmVjb2RlKA0KIyAgcm93bmFtZXMoY291bnRzX1ZTVF9zZWxlY3RlZGdlbmVzKSwgDQojICAhISFzZXROYW1lcyhtYWtlLnVuaXF1ZShhcy5jaGFyYWN0ZXIoYW5ub3RhdGlvbl9pbmZvJGRlc2NyaXB0aW9uKSksICMgY29sdW1uIG9mIGRpY3Rpb25hcnkgdGFibGUgdGhhdCBoYXMgTkVXIG5hbWVzDQojICAgICAgICAgICAgICBhbm5vdGF0aW9uX2luZm8kZW5zZW1ibF9nZW5lX2lkKSAgI2NvbHVtbiBvZiBkaWN0aW9uYXJ5IHRhYmxlIHdpdGggT0xEIG5hbWVzDQojICApDQoNCnJvd25hbWVzKGNvdW50c19WU1Rfc2VsZWN0ZWRnZW5lcykgPC0gYW5ub3RhdGlvbl9pbmZvJG1lcmdlZF9kZXNjcmlwdGlvblttYXRjaChyb3duYW1lcyhjb3VudHNfVlNUX3NlbGVjdGVkZ2VuZXMpLCBhbm5vdGF0aW9uX2luZm8kZW50cmV6X0lEKV0NCg0KDQojcmVtb3ZlIHVudXNlZCB2YXJpYWJsZXMNCiNybShtaXNzaW5nX2dlbmVzKQ0KYGBgDQoNCmBgYHtyLCBmaWcuaGVpZ2h0PTUsIGZpZy53aWR0aD0xNSwgZWNobz1GQUxTRX0NCg0KIyNkZWZpbmUgdGhlIGNvbG9ycyBmb3IgdGhlIGhlYXRtYXAgKGNhdGVnb3JpY2FsKTogMSBjb2xvciBmb3IgZWFjaCBzbWFsbGVzdCBleHBlcmltZW50YWwgdW5pdCB0aGF0IGlzIGJlaW5nICBjb21wYXJlZDsgaS5lLiBoZXJlIHRoZSB0cmVhdG1lbnQNCmNvbG9yX2NhdGVnb3JpY2FsX2hlYXRtYXAgPC0gY29sb3JfY2F0ZWdvcmljYWxfdHJlYXRtZW50DQojbmFtZSB0aGlzIGxpc3Qgb2YgY29sb3Igd2l0aCB0aGUgY29ycmVzcG9uZGluZyBuYW1lcyAobm90ZTogdGhlc2UgYXJlIHRoZSB1bmlxdWUgdmFsdWVzIGZvciB0aGF0IGNhdGVnb3J5IGluIHRoZSBzYW1wbGUgbWV0YWRhdGEpDQpjb2xvcl9jYXRlZ29yaWNhbF9oZWF0bWFwX25hbWVkIDwtIGNvbG9yX2NhdGVnb3JpY2FsX2hlYXRtYXANCm5hbWVzKGNvbG9yX2NhdGVnb3JpY2FsX2hlYXRtYXBfbmFtZWQpIDwtIHVuaXF1ZShzYW1wbGVfbWV0YWRhdGEkdHJlYXRtZW50KQ0KDQojbG9hZCB0aGlzIGluZm9ybWF0aW9uIGludG8gdGhlIGhlYXRtYXANCmNvbEFubiA8LSBIZWF0bWFwQW5ub3RhdGlvbigjZGYgPSBkYXRhLmZyYW1lKHRyZWF0bWVudCA9IHNhbXBsZV9tZXRhZGF0YSR0cmVhdG1lbnQpLCAjdGhlIG5hbWUgb2YgdGhlIGNvbHVtbiBuZWVkcyB0byBtYXRjaCB0aGUgbmFtZSBvZiB0aGUgbmFtZWQgbGlzdA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICNjb2wgPSBsaXN0KCJ0cmVhdG1lbnQiID0gY29sb3JfY2F0ZWdvcmljYWxfaGVhdG1hcF9uYW1lZCksICNzZXQgdGhlIG5hbWUgb2YgdGhlIG5hbWVkIGxpc3Qgc28gaXQgbWF0Y2hlcw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICNhbm5vdGF0aW9uX3dpZHRoID0gdW5pdChjKDEsIDQpLCAnY20nKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjZ2FwID0gdW5pdCgxLCAnbW0nKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3dfbGVnZW5kID0gRkFMU0UsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd19hbm5vdGF0aW9uX25hbWUgPSBGQUxTRSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGljaCA9ICdjb2wnLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICNhbHNvIGNyZWF0ZSBhbiBlbXB0eSByb3cgYWJvZSB0aGUgaGVhdG1hcCwgdG8gZGlzcGxheSBhZGRpdGlvbmFsIGluZm8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbXB0eTEgPSBhbm5vX2VtcHR5KGJvcmRlciA9IEZBTFNFLCBoZWlnaHQ9IHVuaXQoOCwgIm1tIikpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKQ0KDQoNCnNpbWlsYXJpdHlfbGlzdF9uYW1lZCA8LSBjKCJwYWxlZ3JlZW4zIiwgImxpZ2h0Y29yYWwiLCAiZ3JheTgwIiwgIndoaXRlIikNCm5hbWVzKHNpbWlsYXJpdHlfbGlzdF9uYW1lZCkgPC0gYygiVDMiLCAiTVBJIiwgIm5laXRoZXIiLCAiYm90aCIpDQoNCmhhID0gcm93QW5ub3RhdGlvbihkZiA9IGRhdGEuZnJhbWUodHJlYXRtZW50ID0gY29ycl9kZltyb3duYW1lcyhjb3JyX2RmKSAlaW4lIHJvd25hbWVzKGNvdW50c19WU1Rfc2VsZWN0ZWRnZW5lcyksInNpbWlsYXJpdHkiXSksICN0aGUgbmFtZSBvZiB0aGUgY29sdW1uIG5lZWRzIHRvIG1hdGNoIHRoZSBuYW1lIG9mIHRoZSBuYW1lZCBsaXN0DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sID0gbGlzdCgidHJlYXRtZW50IiA9IHNpbWlsYXJpdHlfbGlzdF9uYW1lZCksICNzZXQgdGhlIG5hbWUgb2YgdGhlIG5hbWVkIGxpc3Qgc28gaXQgbWF0Y2hlcw0KICAgICAgICAgICAgICAgICAgIHNpbXBsZV9hbm5vX3NpemUgPSB1bml0KDIsICJjbSIpLA0KICAgICAgICAgICAgICAgICAgIGVtcHR5MiA9IGFubm9fZW1wdHkoYm9yZGVyID0gRkFMU0UsIHdpZHRoPSB1bml0KDgsICJtbSIpKQ0KICAgICAgICAgICAgICAgICAgICkNCg0KDQpIZWF0bWFwKG1hdCA9IHQoc2NhbGUodChjb3VudHNfVlNUX3NlbGVjdGVkZ2VuZXMpKSksDQogICAgICAgIG5hbWU9ICJ6LXNjb3JlIiwNCiAgICAgICAgI2NvbHVtbl90aXRsZSA9IGd0X3JlbmRlcigNCiAgICAgICAgIyAgIlBhdHRlcm4gb2YgZXhwcmVzc2lvbiAoYXMgPHNwYW4gc3R5bGU9J2NvbG9yOmJyb3duMic+Kip6LXNjb3JlcyoqPC9zcGFuPikgPGJyLz4gb2YgQ1BGLXVwcmVndWxhdGVkIGdlbmVzIg0KICAgICAgICAjICApLA0KICAgICAgICBjb2wgPSByZXYoYnJld2VyLnBhbCgxMSwiUmRCdSIpKSwNCiAgICAgICAgbmFfY29sID0gImJsYWNrIiwNCiAgICAgICAgY2x1c3Rlcl9yb3dzID0gVCwNCiAgICAgICAgc2hvd19yb3dfZGVuZCA9IFQsDQogICAgICAgICNyb3dfb3JkZXIgPSBvcmRlcmVkX2xldmVscywNCiAgICAgICAgY2x1c3Rlcl9jb2x1bW5zID0gRkFMU0UsDQogICAgICAgIHNob3dfY29sdW1uX2RlbmQgPSBGQUxTRSwNCiAgICAgICAgI2NvbHVtbl9vcmRlciA9IG9yZGVyZWRfbGV2ZWxzLA0KICAgICAgICAjcm93X3NwbGl0ID0gZmFjdG9yKHBhc3RlMChzYW1wbGVfbWV0YWRhdGEkc2VnbWVudCwgc2FtcGxlX21ldGFkYXRhJHN0YWdlKSwgbGV2ZWxzID0gYygibGl2ZXJTMSIsICJsaXZlclM0IiwgImxpdmVyUzciLCAic3RvbWFjaFMxIiwgImludGVzdGluZVMxIiwgInN0b21hY2hTNCIsICJBX2ludGVzdGluZVM0IiwgIlBfaW50ZXN0aW5lUzQiLCAic3RvbWFjaFM3IiwgIkFfaW50ZXN0aW5lUzciLCAiUF9pbnRlc3RpbmVTNyIpKSwNCiAgICAgICAgY29sdW1uX3NwbGl0ID0gZmFjdG9yKHNhbXBsZV9tZXRhZGF0YSR0cmVhdG1lbnQsIGxldmVscyA9IGMoIkRNU08iLCAiVDNJT1AiLCAiTVBJIiwgIkNQRiIsICJDUEYuVDNJT1AiKSksDQogICAgICAgICNjbHVzdGVyX3Jvd19zbGljZXMgPSBGQUxTRSwNCiAgICAgICAgY2x1c3Rlcl9jb2x1bW5fc2xpY2VzID0gRkFMU0UsDQogICAgICAgIHJvd190aXRsZSA9IE5VTEwsDQogICAgICAgIHJvd19nYXAgPSB1bml0KDAuNSwgIm1tIiksDQogICAgICAgIGNvbHVtbl9nYXAgPSB1bml0KGMocmVwKDEwLDEpLCByZXAoMiwzKSksICJtbSIpLA0KICAgICAgICAjd2lkdGggPSB1bml0KDgsICJjbSIpLCANCiAgICAgICAgI2hlaWdodCA9IHVuaXQoOCwgImNtIiksDQogICAgICAgIGNvbHVtbl9uYW1lc19ncCA9IGdyaWQ6OmdwYXIoZm9udHNpemUgPSA4KSwNCiAgICAgICAgcm93X25hbWVzX2dwID0gZ3JpZDo6Z3Bhcihmb250c2l6ZSA9IDgpLA0KICAgICAgICB0b3BfYW5ub3RhdGlvbiA9IGNvbEFubiwNCiAgICAgICAgcmlnaHRfYW5ub3RhdGlvbiA9IGhhLA0KICAgICAgICBzaG93X3Jvd19uYW1lcyA9IEZBTFNFLA0KICAgICAgICBzaG93X2NvbHVtbl9uYW1lcyA9IEZBTFNFLA0KICAgICAgICBzaG93X2hlYXRtYXBfbGVnZW5kID0gRiwNCiAgICAgICAgYm9yZGVyID0gVFJVRSwNCiAgICAgICAgY2x1c3RlcmluZ19tZXRob2Rfcm93cyA9ICd3YXJkLkQyJw0KICAgICAgICAjdXNlX3Jhc3RlciA9IFRSVUUsIHJhc3Rlcl9tYWdpY2tfZmlsdGVyID0gIkdhdXNzaWFuIg0KICAgICAgICApDQoNCg0KbGlicmFyeShHZXRvcHRMb25nKSAgIyBmb3IgdGhlIGZ1bmN0aW9uIHFxKCkNCmdyb3VwX2Jsb2NrX2Fubm8gPSBmdW5jdGlvbihncm91cCwgZW1wdHlfYW5ubywgZ3AgPSBncGFyKCksIA0KICAgIGxhYmVsID0gTlVMTCwgbGFiZWxfZ3AgPSBncGFyKCkpIHsNCg0KICAgIHNlZWtWaWV3cG9ydChxcSgiYW5ub3RhdGlvbl9Ae2VtcHR5X2Fubm99X0B7bWluKGdyb3VwKX0iKSkNCiAgICBsb2MxID0gZGV2aWNlTG9jKHggPSB1bml0KDAsICJucGMiKSwgeSA9IHVuaXQoMCwgIm5wYyIpKQ0KICAgIHNlZWtWaWV3cG9ydChxcSgiYW5ub3RhdGlvbl9Ae2VtcHR5X2Fubm99X0B7bWF4KGdyb3VwKX0iKSkNCiAgICBsb2MyID0gZGV2aWNlTG9jKHggPSB1bml0KDEsICJucGMiKSwgeSA9IHVuaXQoMSwgIm5wYyIpKQ0KDQogICAgc2Vla1ZpZXdwb3J0KCJnbG9iYWwiKQ0KICAgIGdyaWQucmVjdChsb2MxJHgsIGxvYzEkeSwgd2lkdGggPSBsb2MyJHggLSBsb2MxJHgsIGhlaWdodCA9IGxvYzIkeSAtIGxvYzEkeSwgDQogICAgICAgIGp1c3QgPSBjKCJsZWZ0IiwgImJvdHRvbSIpLCBncCA9IGdwKQ0KICAgIGlmKCFpcy5udWxsKGxhYmVsKSkgew0KICAgICAgICBncmlkLnRleHQobGFiZWwsIHggPSAobG9jMSR4ICsgbG9jMiR4KSowLjUsIHkgPSAobG9jMSR5ICsgbG9jMiR5KSowLjUsIGdwID0gbGFiZWxfZ3ApDQogICAgfQ0KfQ0KDQpncm91cF9ibG9ja19hbm5vKDE6MSwgImVtcHR5MSIsIGdwID0gZ3BhcihmaWxsID0gImdyYXk3MCIpLCBsYWJlbCA9ICJETVNPIikNCmdyb3VwX2Jsb2NrX2Fubm8oMjoyLCAiZW1wdHkxIiwgZ3AgPSBncGFyKGZpbGwgPSAicGFsZWdyZWVuMyIpLCBsYWJlbCA9ICJUMytJT1AiKQ0KZ3JvdXBfYmxvY2tfYW5ubygzOjMsICJlbXB0eTEiLCBncCA9IGdwYXIoZmlsbCA9ICJsaWdodGNvcmFsIiksIGxhYmVsID0gIk1QSSIpDQpncm91cF9ibG9ja19hbm5vKDQ6NCwgImVtcHR5MSIsIGdwID0gZ3BhcihmaWxsID0gImxpZ2h0c2t5Ymx1ZSIpLCBsYWJlbCA9ICJDUEYiKQ0KZ3JvdXBfYmxvY2tfYW5ubyg1OjUsICJlbXB0eTEiLCBncCA9IGdwYXIoZmlsbCA9ICJvcmNoaWQyIiksIGxhYmVsID0gIkNQRitUMytJT1AiKQ0KDQoNCmBgYA0KDQoNCg0KDQoNCiMjIyMjIF9fT3Zlci1yZXByZXNlbnRhdGlvbiBBbmFseXNpczpfXw0KDQpgciBlbW86OmppKCJtYWduaWZ5aW5nIGdsYXNzIHRpbHRlZCByaWdodCIpYCBDYW4gd2UgZ2V0IHNvbWUgYnJvYWQgaWRlYXMgb2YgdGhlIGZhbWlsaWVzIG9mIGdlbmVzIHJlcHJlc2VudGVkIGJ5IHRoZSBnZW5lcyB3ZSBoYXZlIGZvdW5kIHRvIGJlIGRpZmZlcmVudGlhbGx5IGV4cHJlc3NlZD8gSW4gb3VyIHJhbmtlZCBsaXN0IG9mIERpZmZlcmVudGlhbGx5IEV4cHJlc3NlZCBnZW5lcywgYXJlIHNvbWUgcGF0aHdheXMvYmlvbG9naWNhbCBwcm9jZXNzZXMgb3Zlci1yZXByZXNlbnRlZD8gV2Ugd2lsbCB1c2UgdGhlIGNsdXN0ZXJQcm9maWxlUi9lbnJpY2hlUiBwYWNrYWdlcyBmb3IgYSBmaXJzdCBhbmFseXNpcy4NCg0KDQoNCmBgYHtyLCBlY2hvPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQ0KI092ZXIgcmVwcmVzZW50YXRpb24gYW5hbHlzaXMgKG92ZXItcmVwcmVzZW50YXRpb24gb2YgR086dGVybXMgaW4gRGlmZkV4cHJlc3NlZCBnZW5lcyAoYXMgZGVmaW5lZCBieSB1cyBhIGxvZ0ZDPjIgYW5kIHAgPDAuMDUpKQ0KIyB1bmNvbW1lbnQgaWYgbm90IHJ1biB0aGlzIGVhcmxpZXIgaW4gdGhlIGNvZGUgYW5kIG9iamVjdCAiZW5zZW1ibCIgZG9lcyBub3QgZXhpc3QNCnJlcXVpcmUoYmlvbWFSdCkNCmVuc2VtYmwgPC0gdXNlTWFydCgnZW5zZW1ibCcsIGRhdGFzZXQgPSAnYW9jZWxsYXJpc19nZW5lX2Vuc2VtYmwnKQ0KI3RhYl9HTw0KR09fYW5ub3RhdGlvbnMgPC0gZ2V0Qk0oYXR0cmlidXRlcyA9IGMoImVuc2VtYmxfZ2VuZV9pZCIsICduYW1lc3BhY2VfMTAwMycsICJnb19pZCIsICJuYW1lXzEwMDYiKSwNCiAgICAgICAgICAgICAgICAgICAgICAgIG1hcnQgPSBlbnNlbWJsKQ0KI29ubHkga2VlcCBnZW5lcyBhbm5vdGF0ZWQgZm9yIEJpb2xvZ2ljYWwgUHJvY2VzcyBHTyB0ZXJtcw0KR09fYW5ub3RhdGlvbnMgPC0gc3Vic2V0KEdPX2Fubm90YXRpb25zLCAobmFtZXNwYWNlXzEwMDMgJWluJSAiYmlvbG9naWNhbF9wcm9jZXNzIikpDQoNCiNsZXQgdXMgYWxzbyBhZGQgYSBjb2x1bW4gd2l0aCB0aGUgZGVzY3JpcHRpb25zIGZyb20gb3VyIGFubm90YXRpb25faW5mbyBmaWxlDQpHT19hbm5vdGF0aW9ucyRkZXNjcmlwdGlvbiA8LSBhbm5vdGF0aW9uX2luZm8kbWVyZ2VkX2Rlc2NyaXB0aW9uW21hdGNoKEdPX2Fubm90YXRpb25zJGVuc2VtYmxfZ2VuZV9pZCwgYW5ub3RhdGlvbl9pbmZvJGVuc2VtYmxfSUQpXQ0KDQpgYGANCg0KYGBge3IsIGVjaG89RkFMU0V9DQojbG9hZCBkaWZmZXJlbnRpYWxseSBleHByZXNzZWQgZ2VuZXMgYmV0d2VlbiBTMSBhbmQgUzcsIHJhbmtlZCBieSBGQw0KREVfZ2VuZXMgPC0gdG9wX3RhYmxlW3RvcF90YWJsZSRlbnRyZXpfSUQgJWluJSB0b3BfdGFibGUkZW50cmV6X0lEW2JvdGhdLCBdJGVuc2VtYmxfSUQNCg0KI3JlbW92ZSBnZW5lcyB0aGF0IGRvIG5vdCBoYXZlIGFuIGVuc2VtYmxfSUQNCkRFX2dlbmVzIDwtIG5hLm9taXQoREVfZ2VuZXMpDQoNCiNmb3IgbGF0ZXIsIGFsc28gcHJlcGFyZSBhIGxpc3Qgb2YgREVfZ2VuZXMsIGJ1dCB0aGVpciBkZXNjcmlwdGlvbnMgaW5zdGVhZCBvZiB0aGUgZW5zZW1ibF9pZA0KREVfZ2VuZXNfZGVzY3JpcHRpb24gPC0gdG9wX3RhYmxlW3RvcF90YWJsZSRlbnNlbWJsX0lEICVpbiUgREVfZ2VuZXMsIF0kbWVyZ2VkX2Rlc2NyaXB0aW9uDQoNCg0KI3ByZXBhcmUgdGhlIHJlcXVpcmVkIGRpY3Rpb25hcnkgdGFibGVzDQojVEVSTTJHRU5FIDwtIEdPX2Fubm90YXRpb25zW2MoImdvX2lkIiwgImVuc2VtYmxfZ2VuZV9pZCIpXQ0KI1RFUk0yTkFNRSA8LSBHT19hbm5vdGF0aW9uc1tjKCJnb19pZCIsICJuYW1lXzEwMDYiKV0NCg0KI2xldCdzIHRyeSB0byBtYWtlIGRpY3Rpb25hcmllcyBiYXNlZCBvbiBnZW5lIGRlc2NyaXB0aW9uIHJhdGhlciB0aGFuIGdlbmUgY29kZQ0KVEVSTTJHRU5FIDwtIEdPX2Fubm90YXRpb25zW2MoImdvX2lkIiwgImRlc2NyaXB0aW9uIildDQpURVJNMk5BTUUgPC0gR09fYW5ub3RhdGlvbnNbYygiZ29faWQiLCAibmFtZV8xMDA2IildDQojaW4gd2hpY2ggY2FzZSwgdGhlIERFX0dlbmVzIGxpc3QgbmVlZHMgdG8gYmUgZGVzY3JpcHRpb25zDQpERV9nZW5lczIgPC0gYW5ub3RhdGlvbl9pbmZvJGVuc2VtYmxfZGVzY3JpcHRpb25bbWF0Y2goREVfZ2VuZXMsYW5ub3RhdGlvbl9pbmZvJGVuc2VtYmxfSUQpXQ0KDQplbnJpY2hlZF9vYmplY3QgPC0gZW5yaWNoZXIoREVfZ2VuZXMyLCANCiAgICAgICAgIHB2YWx1ZUN1dG9mZiA9IDAuMDUsIA0KICAgICAgICAgcEFkanVzdE1ldGhvZCA9ICJCSCIsIA0KICAgICAgICAgI3VuaXZlcnNlLCANCiAgICAgICAgICNtaW5HU1NpemUgPSAxMCwgDQogICAgICAgICAjbWF4R1NTaXplID0gNTAwLCANCiAgICAgICAgIHF2YWx1ZUN1dG9mZiA9IDAuMDUsIA0KICAgICAgICAgVEVSTTJHRU5FID0gVEVSTTJHRU5FLCANCiAgICAgICAgIFRFUk0yTkFNRSA9IFRFUk0yTkFNRSkNCg0KI2dvcGxvdChlbnJpY2hlZF9vYmplY3QpDQpgYGANCg0KPGJyLz4gKiBUb3Agb3Zlci1yZXByZXNlbnRlZCBHZW5lIE9udG9sb2d5IGdlbmUgc2V0cyAob3JkZXJlZCBieSBhZGp1c3RlZCBwLnZhbHVlLCBkZXNjZW5kaW5nKToNCmBgYHtyLCBmaWcuaGVpZ2h0PTQsIGZpZy53aWR0aD04LCBlY2hvPUZBTFNFfQ0KI2VucmljaGVkX29iamVjdA0KT3ZlclJlcHJlc2VudGF0aW9uX3Bsb3QxIDwtIGJhcnBsb3QoZW5yaWNoZWRfb2JqZWN0LCB4PSJjb3VudCIsIHNob3dDYXRlZ29yeSA9IGxlbmd0aChlbnJpY2hlZF9vYmplY3RAcmVzdWx0KSwgY29sb3IgPSAicC5hZGp1c3QiKSsNCiAgc2NhbGVfZmlsbF9ncmFkaWVudG4oY29sb3VycyA9IHJldihicmV3ZXIucGFsKDksIkJsdWVzIilbMjo5XSkpKw0KICBOVUxMDQpPdmVyUmVwcmVzZW50YXRpb25fcGxvdDENCmBgYA0KDQo8YnIvPiAqIC4uLiBhbmQgZ2VuZXMgYXNzb2NpYXRlZCB3aXRoIGl0IChub3RpY2UgdGhlIG92ZXJsYXBzIG9mIGdlbmVzIGJlbG9uZ2luZyB0byBtdWx0aXBsZSBzZXRzKToNCg0KYGBge3IsIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD0xNSwgZWNobz1GQUxTRX0NCiNodHRwczovL3l1bGFiLXNtdS50b3AvYmlvbWVkaWNhbC1rbm93bGVkZ2UtbWluaW5nLWJvb2svZW5yaWNocGxvdC5odG1sDQpPdmVyUmVwcmVzZW50YXRpb25fcGxvdDIgPC0gaGVhdHBsb3QoZW5yaWNoZWRfb2JqZWN0LCBzaG93Q2F0ZWdvcnk9bGVuZ3RoKGVucmljaGVkX29iamVjdEByZXN1bHQpICkrIA0KICAjY29vcmRfZXF1YWwoKSArIA0KICBOVUxMDQoNCk92ZXJSZXByZXNlbnRhdGlvbl9wbG90MisgZ2dwbG90Mjo6Y29vcmRfZmxpcCgpDQpgYGANCg0KPGJyLz4gKiBSZWxhdGlvbnNoaXAgYmV0d2VlbiB0aGUgR2VuZSBzZXRzIGlkZW50aWZpZWQ6DQpgYGB7ciwgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRX0NCmVucmljaGVkX29iamVjdF93aXRoX3NpbWlsYXJpdHkgPC0gcGFpcndpc2VfdGVybXNpbShlbnJpY2hlZF9vYmplY3QpDQpPdmVyUmVwcmVzZW50YXRpb25fcGxvdDMgPC0gZW1hcHBsb3QoZW5yaWNoZWRfb2JqZWN0X3dpdGhfc2ltaWxhcml0eSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2V4X2xhYmVsX2NhdGVnb3J5PTAuNiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2V4X2NhdGVnb3J5PTEuNSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2V4X2xpbmU9MSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd0NhdGVnb3J5PWxlbmd0aChlbnJpY2hlZF9vYmplY3Rfd2l0aF9zaW1pbGFyaXR5QHJlc3VsdCkgKSsNCiAgc2NhbGVfZmlsbF9ncmFkaWVudG4oY29sb3VycyA9IHJldihicmV3ZXIucGFsKDksIkJsdWVzIilbMTo5XSkpKw0KICBOVUxMDQpPdmVyUmVwcmVzZW50YXRpb25fcGxvdDMNCmBgYA0KPGJyLz4gKiBRdWFudGlmaWNhdGlvbiBvZiB0aGUgb3ZlcmxhcCBiZXR3ZWVuIGdlbmVzIGluIGVhY2ggc2V0Og0KDQpgYGB7ciwgZWNobz1GQUxTRX0NCiNPdmVyUmVwcmVzZW50YXRpb25fcGxvdDQgPC0gdXBzZXRwbG90KGVucmljaGVkX29iamVjdCwgc2hvd0NhdGVnb3J5PWxlbmd0aChlbnJpY2hlZF9vYmplY3RAcmVzdWx0KSkNCiNPdmVyUmVwcmVzZW50YXRpb25fcGxvdDQNCg0KDQojdG8gYmUgYWJsZSB0byBjdXN0b21pc2UgdGhlIGNvbG9ycyBvZiB0aGUgdXBzZXRwbG90LCB3ZSB3aWxsIG1vZGlmeSBpdHMgc291cmNlIGNvZGUgYW5kIGNhbGwgaXQgZnJvbSB0aGVyZQ0KI2h0dHBzOi8vZ2l0aHViLmNvbS9ZdUxhYi1TTVUvZW5yaWNocGxvdC9ibG9iL21hc3Rlci9SL3Vwc2V0cGxvdC5SDQoNCmxpc3QyZGYgPC0gZnVuY3Rpb24oaW5wdXRMaXN0KSB7DQogICAgIyBsZGYgPC0gbGFwcGx5KDE6bGVuZ3RoKGlucHV0TGlzdCksIGZ1bmN0aW9uKGkpIHsNCiAgICBsZGYgPC0gbGFwcGx5KHNlcV9sZW4obGVuZ3RoKGlucHV0TGlzdCkpLCBmdW5jdGlvbihpKSB7DQogICAgICAgIGRhdGEuZnJhbWUoY2F0ZWdvcnlJRD1yZXAobmFtZXMoaW5wdXRMaXN0W2ldKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGgoaW5wdXRMaXN0W1tpXV0pKSwNCiAgICAgICAgICAgICAgICAgICBHZW5lPWlucHV0TGlzdFtbaV1dKQ0KICAgIH0pDQoNCiAgICBkby5jYWxsKCdyYmluZCcsIGxkZikNCn0NCg0KdGhlbWVfZG9zZSA8LSBmdW5jdGlvbihmb250LnNpemU9MTQpIHsNCiAgICB0aGVtZV9idygpICsNCiAgICAgICAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoY29sb3VyID0gImJsYWNrIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IGZvbnQuc2l6ZSwgdmp1c3QgPTEgKSwNCiAgICAgICAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoY29sb3VyID0gImJsYWNrIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IGZvbnQuc2l6ZSwgaGp1c3QgPTEgKSwNCiAgICAgICAgICAgICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChtYXJnaW49bWFyZ2luKDEwLCA1LCAwLCAwKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvciA9ICJibGFjayIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IGZvbnQuc2l6ZSksDQogICAgICAgICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChhbmdsZT05MCkNCiAgICAgICAgICAgICAgKQ0KfQ0KICAgIA0KZGYgPC0gYXMuZGF0YS5mcmFtZShlbnJpY2hlZF9vYmplY3QpDQppZCA8LSBkZiRJRFsxOjldICN0aGVzZSBhcmUgdGhlIEdPIGlkcw0KZGVzIDwtIGRmJERlc2NyaXB0aW9uWzE6OV0gI3RoZXNlIGFyZSB0aGUgR08gdGl0bGVzDQpnbGlzdCA8LSBnZW5lSW5DYXRlZ29yeShlbnJpY2hlZF9vYmplY3QpW2lkXQ0KbmFtZXMoZ2xpc3QpIDwtIGRlcw0KZCA8LSBsaXN0MmRmKGdsaXN0KQ0KcmVzIDwtIHRpYmJsZTo6dGliYmxlKERlc2NyaXB0aW9uID0gc3BsaXQoZFssMV0sIGRbLDJdKSkNCg0KT3ZlclJlcHJlc2VudGF0aW9uX3Bsb3Q0IDwtIGdncGxvdChyZXMsIGFlc18oeCA9IH5EZXNjcmlwdGlvbikpICsgDQogIGdlb21fYmFyKGZpbGw9IHJldihjb2xvclJhbXBQYWxldHRlKGJyZXdlci5wYWwoOSwiQmx1ZXMiKSkobGVuZ3RoKHVuaXF1ZShyZXMkRGVzY3JpcHRpb24pKSkpKSArICMgZm9yIHNlcXVlbmNlIG9mIGNvbG9ycw0KICAjZ2VvbV9iYXIoZmlsbD1jKHJlcCgiZ3JheSIsNS0xKSxyZXAoImRvZGdlcmJsdWUiLDEpLCByZXAoImdyYXkiLGxlbmd0aCh1bmlxdWUocmVzJERlc2NyaXB0aW9uKSktNSkpKSArICAjdG8gaGlnaGxpZ2h0IGEgc3BlY2lmaWMgY2F0ZWdvcnkgYXQgcG9zaXRpb24gZS5nLiA1DQogICNzY2FsZV9maWxsX2dyYWRpZW50KGNvbG91cnMgPSByZXYoYnJld2VyLnBhbCg5LCJCbHVlcyIpWzE6OV0pKSsNCiAgdGhlbWVfZG9zZShmb250LnNpemUgPSAxMikgKw0KICB4bGFiKE5VTEwpICsgDQogIHlsYWIoTlVMTCkgKw0KICBnZ3Vwc2V0OjpzY2FsZV94X3Vwc2V0KG9yZGVyX2J5ID0gImRlZ3JlZSIpKyAjZGVmYXVsdCB3YXMgb3JkZXJfYnkgPSAiZnJlcSINCiAgTlVMTA0KDQpPdmVyUmVwcmVzZW50YXRpb25fcGxvdDQgICAgDQojcmVtb3ZlIHVudXNlZCB2YXJpYWJsZXMNCnJtKGxpc3QyZGYsIGRmLCBpZCwgZGVzLCBnbGlzdCwgZCwgcmVzLCB0aGVtZV9kb3NlKQ0KYGBgDQo8YnIvPiBCZWxvdywgYSBsaXN0IG9mIHRoZSBwYXRod2F5IGlkZW50aWZpZWQgYnkgR2VuZSBFbnJpY2htZW50IEFuYWx5c2lzLCBhbmQgdGhlIGdlbmVzIGluIG91ciBkaWZmZXJlbnRpYWwtZXhwcmVzc2lvbiBsaXN0IHRoYXQgYmVsb25nIHRvIGVhY2g6IDxici8+DQpgYGB7ciwgZWNobz1GQUxTRX0NCiNwcmludCBhIGxpc3Qgb2YgdGhlIGdlbmUgc2V0cyBpZGVudGlmaWVkIGFzIHNpZ25pZmljYW50LCBhbmQgdGhlIGdlbmVzIGJlbG9uZ2luZyB0byBlYWNoIGNhdGVnb3J5DQojIG5hbWVzKGVucmljaGVkX29iamVjdEBnZW5lU2V0c1tlbnJpY2hlZF9vYmplY3RAcmVzdWx0W1siSUQiXV1bMTo5XV0pICN0aGVzZSBhcmUgdGhlIEdPIGlkcyBmb3VuZCBzaWduaWZpY2FudA0KDQpjb2xsYXRlZF9kYXRhZnJhbWUgPC0gZGF0YS5mcmFtZShpbmRleD0gc2VxKDE6MykpDQoNCmZvciAoaSBpbiAxOmxlbmd0aChlbnJpY2hlZF9vYmplY3RAcmVzdWx0KSkgew0KICBjb2wgPC0gYXMuZGF0YS5mcmFtZShlbnJpY2hlZF9vYmplY3RAZ2VuZVNldHNbZW5yaWNoZWRfb2JqZWN0QHJlc3VsdFtbIklEIl1dWzE6bGVuZ3RoKGVucmljaGVkX29iamVjdEByZXN1bHQpXV1bbmFtZXMoZW5yaWNoZWRfb2JqZWN0QGdlbmVTZXRzW2VucmljaGVkX29iamVjdEByZXN1bHRbWyJJRCJdXVtpXV0pXSkNCiAgI29ubHkga2VlcCBnZW5lcyB0aGF0IGFyZSBhbW9uZyBvdXIgREUgZ2VuZXMNCiAgY29sIDwtIGFzLmRhdGEuZnJhbWUoY29sW2NvbFssMV0gJWluJSBERV9nZW5lc19kZXNjcmlwdGlvbixdKQ0KICAjd2UgbmVlZCB0byByZW5hbWUgdGhlIGNvbHVtbg0KICBjb2xuYW1lcyhjb2wpIDwtIG5hbWVzKGVucmljaGVkX29iamVjdEBnZW5lU2V0c1tlbnJpY2hlZF9vYmplY3RAcmVzdWx0W1siSUQiXV1baV1dKQ0KICAjYWRkIGluZGV4IGNvbHVtbiBvdGhlcndpc2Ugd2UgY2Fubm90IG1lcmdlIHByb3Blcmx5DQogIGNvbCRpbmRleCA8LSBzZXEoMTpkaW0oY29sKVsxXSkNCiAgI21lcmdlIHRoZSBuZXcgY29sdW1uIChHTyBnZW5lIHNldCArIGdlbmVzKSwgd2l0aCBhbGwgcHJldmlvdXMgb25lcw0KICBjb2xsYXRlZF9kYXRhZnJhbWUgPC0gbWVyZ2UoY29sbGF0ZWRfZGF0YWZyYW1lLCBjb2wgLCBieT0iaW5kZXgiLCBhbGw9VFJVRSkNCn0NCg0KI3JlbW92ZSBpbmRleCBjb2x1bW4NCmNvbGxhdGVkX2RhdGFmcmFtZSA8LSBjb2xsYXRlZF9kYXRhZnJhbWVbLDI6ZGltKGNvbGxhdGVkX2RhdGFmcmFtZSlbMl1dDQoNCg0KZm9yIChpIGluIDE6bGVuZ3RoKGVucmljaGVkX29iamVjdEByZXN1bHQpKSB7DQogIGNvbG5hbWVzKGNvbGxhdGVkX2RhdGFmcmFtZSlbaV0gPC0gIGRpc3RpbmN0KFRFUk0yTkFNRSkkbmFtZV8xMDA2W2Rpc3RpbmN0KFRFUk0yTkFNRSkkZ29faWQgPT0gIG5hbWVzKGVucmljaGVkX29iamVjdEBnZW5lU2V0c1tlbnJpY2hlZF9vYmplY3RAcmVzdWx0W1siSUQiXV1baV1dKV0gDQp9DQoNCg0KY29sbGF0ZWRfZGF0YWZyYW1lDQpgYGANCg0KDQojIyMjIyBfX0dlbmUgU2V0IEVucmljaG1lbnQgYW5hbHlzaXM6X18NCg0KYHIgZW1vOjpqaSgibWFnbmlmeWluZyBnbGFzcyB0aWx0ZWQgcmlnaHQiKWAgQ29tcGxlbWVudGFyaWx5LCB3ZSBjYW4gcGVyZm9ybSBHZW5lIFNldCBFbnJpY2htZW50IEFuYWx5c2lzIChHU0UpLCBub3Qgb24ganVzdCB0aGUgZ2VuZXMgd2UgaGF2ZSBmb3VuZCB0byBiZSB0cnVseSBEaWZmZXJlbnRpYWxseSBFeHByZXNzZWQgKGkuZS4gc2lnbmlmaWNhbnQsIGZvbGQgY2hhbmdlIGFib3ZlIGEgZ2l2ZW4gdGhyZXNob2xkKSwgYnV0IG9uIGFsbCBnZW5lcyBmb3VuZCB0byBkaWZmZXIgYmV0d2VlbiB0aGUgdHdvIHRpbWVwb2ludHMuIEdTRSB3aWxsIGxvb2sgZm9yIGdlbmVzIHNob3dpbmcgc2lnbmlmaWNhbnRseSBjby1vcmRpbmF0ZWQgc2hpZnRzIGluIGV4cHJlc3Npb24gYWNyb3NzIHRoZSB0aW1lcG9pbnRzLCByZWdhcmRsZXNzIG9mIHRoZWlyIG1hZ25pdHVkZSwgYW5kIGluZGljYXRlIHRoZSBHZW5lIE9udG9sb2d5IGZhbWlseSB0byB3aGljaCB0aGV5IG1vc3QgYmVsb25nLg0KDQpgYGB7ciwgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCiNHZW5lIFNldCBFbnJpY2htZW50IGFuYWx5c2lzICh0byBjYXB0dXJlIGdlbmVzIHRoYXQgZGlkIG5vdCBwYXNzIG91ciB0aHJlc2hvbGQgb2YgRGlmZkV4cHJlc3Npb24pDQoNCiNwcmVwYXJlIHRoZSByZXF1aXJlZCBkaWN0aW9uYXJ5IHRhYmxlcw0KR0VORUxJU1QgPC0gbmEub21pdCh0b3BfdGFibGVbYygiZW5zZW1ibF9kZXNjcmlwdGlvbiIsICJsb2dGQyIpXSkgI3JlbWVtYmVyIHRoYXQgaGVyZSB1c3VhbGx5IHlvdSB3b3VsZCB1c2UgdGhlIEdlbmVJRCwgYnV0IHdlIHVzZSBkZXNjcmlwdGlvbnMgaW5zdGVhZCB0byBoYXZlIG1vcmUgaW5mb3JtYXRpdmUgbmFtZXMNCg0KI3RoZSBHU0VBIGZ1bmN0aW9uIHdpbGwgZ2l2ZSBhIHdhcm5pbmcgaWYgdHdvIHJhbmtpbmcgdmFsdWVzIChpbiB0aGlzIGNhc2UsIGxvZ0ZDIHZhbHVlcykgYXJlIHRoZSBzYW1lLiBXZSBjYW4gc29sdmUgdGhpcyBieSBjcmVhdGluZyBhIHJhbmssIHdoZXJlIHRpZWQgZW50cmllcyBhcmUgc29ydGVkIHJhbmRvbWx5Lg0KI3NlZSBodHRwczovL2dpdGh1Yi5jb20vWXVMYWItU01VL2NsdXN0ZXJQcm9maWxlci9pc3N1ZXMvMjE0DQpHRU5FTElTVCA8LSBHRU5FTElTVCAlPiUgbXV0YXRlKHJhbmsgPSByYW5rKGxvZ0ZDLCAgdGllcy5tZXRob2QgPSAicmFuZG9tIikpIA0KDQojbm93IHNvcnQgaW4gZGVjcmVhc2luZyByYW5rIG9yZGVyDQpHRU5FTElTVCA8LSBHRU5FTElTVFtvcmRlcihHRU5FTElTVCRyYW5rLCBkZWNyZWFzaW5nID0gVFJVRSksXQ0KDQoNCiMjIGFzc3VtZSAxc3QgY29sdW1uIGlzIElEDQojIyAybmQgY29sdW1uIGlzIEZDDQoNCiMjIGZlYXR1cmUgMTogbnVtZXJpYyB2ZWN0b3INCmdlbmVMaXN0ID0gR0VORUxJU1RbLDJdDQojZ2VuZUxpc3QgPSBHRU5FTElTVFssM10gIyBpZiB1c2luZyByYW5rIGNvbHVtbg0KDQojIyBmZWF0dXJlIDI6IG5hbWVkIHZlY3Rvcg0KbmFtZXMoZ2VuZUxpc3QpID0gYXMuY2hhcmFjdGVyKEdFTkVMSVNUWywxXSkNCg0KIyMgZmVhdHVyZSAzOiBkZWNyZWFzaW5nIG9yZGVyDQojZ2VuZUxpc3QgPSBzb3J0KGdlbmVMaXN0LCBkZWNyZWFzaW5nID0gVFJVRSkNCg0KDQoNCmVucmljaGVkX2dlbmVzZXRfb2JqZWN0IDwtIEdTRUEoZ2VuZUxpc3QsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBURVJNMkdFTkUgPSBURVJNMkdFTkUsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBURVJNMk5BTUUgPSBURVJNMk5BTUUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICNzY29yZVR5cGUgPSAicG9zIiAgICAjaWYgdXNpbmcgcmFuayBjb2x1bW4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQ0KDQplbnJpY2hlZF9nZW5lc2V0X29iamVjdEByZXN1bHQNCg0KYGBgDQoNCmBgYHtyLCBlY2hvPUZBTFNFLCBmaWcud2lkdGg9MjAsIGZpZy5oZWlnaHQ9NX0NCiNpbmRleCBvZiBlbnJpY2hlZCBwYXRod2F5cyB3aXRoIHBvc2l0aXZlIE5FUw0KI3doaWNoKGVucmljaGVkX2dlbmVzZXRfb2JqZWN0QHJlc3VsdCRORVMgPiAwKSANCiN3aGljaChlbnJpY2hlZF9nZW5lc2V0X29iamVjdEByZXN1bHQkTkVTIDwgMCkgDQoNCnBsb3QxIDwtIGdzZWFwbG90MihlbnJpY2hlZF9nZW5lc2V0X29iamVjdCwgDQogICAgICAgICAgICAgICAgICAgZ2VuZVNldElEID0gd2hpY2goZW5yaWNoZWRfZ2VuZXNldF9vYmplY3RAcmVzdWx0JE5FUyA+IDApLA0KICAgICAgICAgICAgICAgICAgIHN1YnBsb3RzID0gMToyKQ0KcGxvdDIgPC0gZ3NlYXBsb3QyKGVucmljaGVkX2dlbmVzZXRfb2JqZWN0LCANCiAgICAgICAgICAgICAgICAgICBnZW5lU2V0SUQgPSB3aGljaChlbnJpY2hlZF9nZW5lc2V0X29iamVjdEByZXN1bHQkTkVTIDwgMClbMToxMF0sDQogICAgICAgICAgICAgICAgICAgc3VicGxvdHMgPSAxOjIpDQpwbG90MyA8LSBnc2VhcGxvdDIoZW5yaWNoZWRfZ2VuZXNldF9vYmplY3QsIGdlbmVTZXRJRCA9IDExOjE1KQ0KcGxvdDQgPC0gZ3NlYXBsb3QyKGVucmljaGVkX2dlbmVzZXRfb2JqZWN0LCBnZW5lU2V0SUQgPSAxNjoyMCkNCg0KZ2dhcnJhbmdlKHBsb3RfbGlzdChwbG90MSksIHBsb3RfbGlzdChwbG90MiksIG5jb2wgPSAyLCBucm93ID0gMSkNCg0KDQpgYGANCg0KDQpgYGB7ciwgZWNobz1GQUxTRX0NCiNvdXRwdXQgbGlzdCBvZiBnZW5lcyBmb3IgdXByZWd1bGF0ZWQgZ2VuZSBzZXRzDQojZm9yIGVhY2ggb2YgdGhlIHRvcCAoZS5nLikgMTUgcmFua2luZyBHTyBwYXRod2F5cw0KZm9yIChpIGluIHdoaWNoKGVucmljaGVkX2dlbmVzZXRfb2JqZWN0QHJlc3VsdCRORVMgPiAwKSkgew0KICBwYXRod2F5X2dlbmVzIDwtIGFubm90YXRpb25faW5mb1thbm5vdGF0aW9uX2luZm8kZW5zZW1ibF9kZXNjcmlwdGlvbiAlaW4lIG5hLm9taXQoVEVSTTJHRU5FW1RFUk0yR0VORSRnb19pZCAlaW4lIGVucmljaGVkX2dlbmVzZXRfb2JqZWN0QHJlc3VsdCRJRFtpXSwgImRlc2NyaXB0aW9uIiBdKSwgImVuc2VtYmxfSUQiXSN0YWtlIHRoZSBwYXRod2F5IHdpdGggdGhhdCBsYWJlbCwgYW5kIHRoZSBnZW5lcyB0aGF0IGJlbG9uZyB0byBpdCAoaS5lLiB0aGUgbm9uLU5BIGVudHJpZXMpDQogICNwYXRod2F5X2dlbmVzIDwtIHBhdGh3YXlfZ2VuZXNbWzFdXQ0KICBleHByZXNzZWQgPC0gaW50ZXJzZWN0KHBhdGh3YXlfZ2VuZXMsIERFX2dlbmVzKSAjZmluZCB3aGljaCBvZiBhbGwgcGF0aHdheXMgZ2VuZXMgYXJlIGFjdHVhbGx5IHRob3NlIGZvdW5kIGFtb25nc3QgREUgZ2VuZXMNCiAgI3ByaW50KHRvcF90YWJsZVt0b3BfdGFibGUkZW5zZW1ibF9nZW5lX2lkICVpbiUgZXhwcmVzc2VkLCBjKCJGQyIsICJhZGouUC5WYWwiLCAiZW5zZW1ibF9nZW5lX2lkIiwgImRlc2NyaXB0aW9uIiwgIkF2ZUV4cHIiLCAiQ0kuTCIsICJDSS5SIildKQ0KICBwcmludChrYWJsZSh0b3BfdGFibGVbdG9wX3RhYmxlJGVuc2VtYmxfSUQgJWluJSBleHByZXNzZWQsIGMoIkZDIiwgImFkai5QLlZhbCIsICJlbnNlbWJsX0lEIiwgIm1lcmdlZF9kZXNjcmlwdGlvbiIsICJBdmVFeHByIiwgIkNJLkwiLCAiQ0kuUiIpXSwgDQogICAgICAgICAgICAgIGNhcHRpb249IHBhc3RlMCgiR2VuZXMgb2YgR08gc2V0OlsiLGVucmljaGVkX2dlbmVzZXRfb2JqZWN0QHJlc3VsdCREZXNjcmlwdGlvbltpXSwiXSBwcmVzZW50IGFtb25zdCBnZW5lcyBvZiBpbnRlcmVzdCIpKSkNCiAgDQp9DQogICAgIA0KDQpgYGANCg0KDQoNCiMjIyMjIF9fTUdTQSBhbmFseXNpcyAoTW9kZWwtYmFzZWQgR2VuZSBTZXQgQW5hbHlzaXNfXzogDQoNCkFuIGFsdGVybmF0aXZlIGFuYWx5c2lzIG9mIGdlbmUtc2V0IGVucmljaG1lbnQgaXMgTW9kZWwtYmFzZWQgR2VuZSBTZXQgQW5hbHlzaXMsIHdoaWNoIHRyaWVzIHRvIGZpbmQgdGhlIG1vc3QgY29uc2VydmF0aXZlIHNldCBvZiBHZW5lIE9udG9sb2d5IGdlbmUgc2V0cyB0aGF0IGNvdmVycyB0aGUgZ2VuZXMgc3VibWl0dGVkIGZvciBhbmFseXNpcyAoaW4gdGhpcyBjYXNlLCB0aGUgZGlmZmVyZW50aWFsbHkgZXhwcmVzc2VkIGdlbmVzKS4gSW4gdGhlb3J5LCB0aGUgcmVzdWx0aW5nIEdlbmUgU2V0cyB3aWxsIGJlIGxlc3MgcmVkdW5kYW50IHRoYW4gcHJldmlvdXMgYXBwcm9hY2hlcy4NCg0KPGJyLz4gVGhlIEdlbmUgc2V0cyB3aXRoIGhpZ2hlc3QgcHJvYmFiaWxpdHkgb2YgYWN0aXZhdGlvbiBhcmU6DQo8YnIvPg0KDQpgYGB7ciwgZmlnLndpZHRoPTgsIGZpZy5oZWlnaHQ9OCwgZWNobz1GQUxTRX0NCiNidXQgdHJ5IGFsc28gY2x1c3RlcnByb2ZpbGVyDQojR3JvdXBzIG9mIGdlbmVzIGlkZW50aWZpZWQgYnkgc29tZSBhbmFseXNlcyBhcmUgdXNlZCBhcyBpbnB1dCBsaXN0IHRvIHRoZSBtZ3NhIGZ1bmN0aW9uIGZyb20gdGhlIG1nc2EgcGFja2FnZTEzDQojKHdpdGggcGFyYW1ldGVycyByZXN0YXJ0cz0zIGFuZCBzdGVwcz0xZTcpLg0KDQojVGhlIG1vZGVsIGFzc3VtZXMgdGhhdCBzb21lIHNldHMgdG8gYmUgaW5mZXJyZWQgYXJlIGFjdGl2ZSBhbmQgdGhhdCBhbGwgZ2VuZXMgbWVtYmVyIG9mIGFjdGl2ZSBzZXRzIGFyZSB0aGVtc2VsdmVzIGFjdGl2ZS4gQWN0aXZlIGdlbmVzIGFyZSBtb3JlIGxpa2VseSB0byBiZWxvbmcgdG8gdGhlIG9ic2VydmF0aW9ucyBhbmQgaW5hY3RpdmUgZ2VuZXMgbm90LiBGaXR0aW5nIHRoZSBtb2RlbCBhbW91bnRzIHRvIGluZmVyIHRoZSBwcm9iYWJpbGl0eSBvZiBldmVyeSBzZXQgdG8gYmUgYWN0aXZlIGdpdmVuIHRoZSBvYnNlcnZhdGlvbnMuDQojQ2xhc3NpY2FsIG1ldGhvZHMgYW5hbHl6ZSBlYWNoIHNldCBpbiBpc29sYXRpb24uIEJlY2F1c2Ugc2V0cyBzdWNoIGFzIGJpb2xvZ2ljYWwgcGF0aHdheXMgb2Z0ZW4gc2hhcmUgZ2VuZXMgd2l0aCBlYWNoIG90aGVyLCB0aGUgcmV0dXJuZWQgbGlzdCBvZiBlbnJpY2hlZCBzZXRzIGlzIHVzdWFsbHkgbG9uZyBhbmQgcmVkdW5kYW50LiBJbiBjb250cmFzdCwgTUdTQSB0YWtlcyBzZXQgb3ZlcmxhcCBpbnRvIGFjY291bnQgYnkgd29ya2luZyBvbiBhbGwgc2V0cyBzaW11bHRhbmVvdXNseSBhbmQgc3Vic3RhbnRpYWxseSByZWR1Y2VzIHRoZSBudW1iZXIgb2YgcmVkdW5kYW50IHNldHMuDQoNCiNlLmcuIHRha2UgbGlzdCBvZiBERSBnZW5lcyBTMS9TMiBbPT0gZXhhbXBsZV9vXQ0KIyB0YWtlIGxpc3Qgb2YgR08gdGVybXMgKG9idGFpbmVkIHByZXZpb3VzbHkpIFs9PSBleGFtcGxlX2dvXQ0KI215c2V0ID0gbmV3KCAiTWdzYVNldHMiLCBzZXRzPWxpc3Qoc2V0MT1MRVRURVJTWzE6M10sIHNldDI9TEVUVEVSU1syOjVdKSApDQoNCg0KI3ByZXBhcmUgdGFibGUgd2hlcmUgZWFjaCBjb2x1bW4gaXMgYSBHTzpwYXRod2F5SUQgYW5kIGVudHJpZXMgYXJlIHRoZSBnZW5lcyB0aGF0IGJlbG9uZyB0byB0aGF0IGdyb3VwDQpHT19hbm5vdGF0aW9uc193aWRlIDwtIEdPX2Fubm90YXRpb25zWywgYygiZW5zZW1ibF9nZW5lX2lkIiwgImdvX2lkIildDQpHT19hbm5vdGF0aW9uc193aWRlJGlkIDwtIHNlcS5pbnQobnJvdyhHT19hbm5vdGF0aW9uc193aWRlKSkNCkdPX2Fubm90YXRpb25zX3dpZGUgPC0gR09fYW5ub3RhdGlvbnNfd2lkZSAlPiUgcGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IGdvX2lkLCB2YWx1ZXNfZnJvbSA9IGVuc2VtYmxfZ2VuZV9pZCkNCg0KI29ubHkga2VlcCBHTyBncm91cHMgd2l0aCBhdCBsZWFzdCA0IGdlbmVzIGFuZCBtYXggNTAwDQpHT19hbm5vdGF0aW9uc193aWRlIDwtIEdPX2Fubm90YXRpb25zX3dpZGUgJT4lIHNlbGVjdF9pZih+IHN1bSghaXMubmEoLikpID4gNCAmIHN1bSghaXMubmEoLikpIDwgNTAwKQ0KDQojcmVwbGFjZSBHTyBjb2RlcyB3aXRoIGZ1bGwgbmFtZXMgc28gdGhlIHJlc3VsdHMgYXJlIGVhc2llciB0byBpbnRlcnByZXQNCnRtcCA8LSBHT19hbm5vdGF0aW9uc1ssIGMoIm5hbWVfMTAwNiIsICJnb19pZCIpXQ0KdG1wIDwtIHRtcFshZHVwbGljYXRlZCh0bXApLF0NCg0KY29sbmFtZXMoR09fYW5ub3RhdGlvbnNfd2lkZSkgPC0gdG1wJG5hbWVfMTAwNlt0bXAkZ29faWQgJWluJSBjb2xuYW1lcyhHT19hbm5vdGF0aW9uc193aWRlKV0NCnJtKHRtcCkNCg0KI3J1biB0aGUgbWdzYSBmdW5jdGlvbg0KTUdTQV9yZXN1bHQgPSBtZ3NhKERFX2dlbmVzLCAjdGhpcyBpcyBhIGxpc3Qgb2YgZ2VuZXMgcHJldmlvdXNseSBvYnRhaW5lZCBkdXJpbmcgdGhlIERFIGFuYWx5c2lzDQogICAgICAgICAgICAgICAgICAgI3Nob3VsZCBtYXliZSBqdXN0IHRha2UgdXByZWd1bGF0ZWQgaW4gb25lIHN0YWdlICBhbmQgdXByZWd1bGF0ZWQgaW4gdGhlIG90aGVyLCBzZXBhcmF0ZWRseQ0KICAgICAgICAgICAgICAgICAgIEdPX2Fubm90YXRpb25zX3dpZGUsIA0KICAgICAgICAgICAgICAgICAgIHJlc3RhcnRzPTUsICANCiAgICAgICAgICAgICAgICAgICBzdGVwcz0xZTcpDQoNCiNzaG93IHRoZSBvcmRlcmVkIGxpc3Qgb2YgZ2VuZSBzZXRzIGZvdW5kDQpzZXRzUmVzdWx0cyhNR1NBX3Jlc3VsdClbb3JkZXIoc2V0c1Jlc3VsdHMoTUdTQV9yZXN1bHQpJGVzdGltYXRlLCBkZWNyZWFzaW5nID0gVFJVRSksXVsxOjI1LF0NCiNwbG90KE1HU0FfcmVzdWx0KQ0KDQojVGhlIG1vZGVsIGhhdmUgdGhyZWUgcGFyYW1ldGVyczoNCiMgzrEsIHRoZSBmYWxzZSBwb3NpdGl2ZSByYXRlIGkuZS4gdGhlIHByb2JhYmlsaXR5IG9mIGFuIGluYWN0aXZlIGdlbmUgdG8gYWN0dWFsbHkgYmUgb2JzZXJ2ZWQ7DQojIM6yLCB0aGUgZmFsc2UgbmVnYXRpdmUgcmF0ZSBpLmUuIHRoZSBwcm9iYWJpbGl0eSBvZiBhbiBhY3RpdmUgZ2VuZSB0byBhY3R1YWxseSBiZSBub3Qgb2JzZXJ2ZWQ7DQojIHAsIHRoZSBwcmlvciBwcm9iYWJpbGl0eSBmb3IgYW55IHNldCB0byBiZSBhY3RpdmUsIGEgdHlwaWNhbGx5IHNtYWxsIG51bWJlciBlbnN1cmluZyBzcGFyc2Ugc29sdXRpb25zIHRvIGJlIGluZmVycmVkDQoNCiNyZXMgPSBzZXRzUmVzdWx0cyhNR1NBX3Jlc3VsdCkNCiNzdWJzZXQocmVzLCBlc3RpbWF0ZSA+IDAuNSkNCmBgYA0KDQo8YnIvPiBCZWxvdywgZm9yIHJlZmVyZW5jZSwgdGhlIHNjb3Jpbmcgb2YgYWxsIEdlbmUgT250b2xvZ3kgZ2VuZSBzZXRzIGNvbnNpZGVyZWQsIGFuZCB0aGUgaHlwZXJwYXJhbWV0ZXJzIG9mIHRoZSBtb2RlbCAoIF9hbHBoYV8gLCBfYmV0YV8sIGFuZCBpbmRpcmVjdGx5IF9wXyApOg0KDQpgYGB7ciwgZWNobz1GQUxTRSwgZmlnLndpZHRoPTksIGZpZy5oZWlnaHQ9OSwgd2FybmluZz1GQUxTRX0NCiNmb3IgY3VzdG9taXNhdGlvbiBwdXJwb3NlcywgbGV0IHVzIHRyeSB0byBvYnRhaW4gdGhlIHNhbWUgcGxvdHMgYXMgcGxvdChNR1NBX3Jlc3VsdCkNCg0KI3NldCBzcGFjZSBmb3IgNCBwbG90cw0KcGFyKG1mcm93PWMoMiwyKSkNCg0KIyNwLCBhbHBoYSwgYmV0YSBoeXBlcnBhcmFtZXRlcnMgb2YgdGhlIG1vZGVsDQojIyBOb3RlIHRoaXMgaXMgdGhlIGluZm9ybWF0aW9uIHRoYXQgd291bGQgYmUgZXh0cmFjdGVkIGZyb20gdGhlIG9yaWdpbmFsIGJvdHRvbSAzIHBsb3RzDQoNCiMgYXZlcmFnZSBudW1iZXIgb2YgZ2VuZSBzZXRzIGV4cGVjdGVkIHRvIGJlIGFjdGl2ZTogcCogbnVtYmVyIG9mIGdlbmUgc2V0cyBjb25zaWRlcmVkDQpwUG9zdCA8LSAocFBvc3QoTUdTQV9yZXN1bHQpW3doaWNoLm1heChwUG9zdChNR1NBX3Jlc3VsdCkkZXN0aW1hdGUpLCBdJHZhbHVlKSpkaW0oTUdTQV9yZXN1bHRAc2V0c1Jlc3VsdHMpWzFdDQojIG1vc3QgbGlrZWx5IGFscGhhIHBhcmFtZXRlciBvZiB0aGUgbW9kZWwgKGZhbHNlIHBvc2l0aXZlKQ0KcEFscGhhIDwtIGFscGhhUG9zdChNR1NBX3Jlc3VsdClbd2hpY2gubWF4KHBQb3N0KE1HU0FfcmVzdWx0KSRlc3RpbWF0ZSksIF0kdmFsdWUNCiMgbW9zdCBsaWtlbHkgYmV0YSBwYXJhbWV0ZXIgb2YgdGhlIG1vZGVsIChmYWxzZSBuZWdhdGl2ZSByYXRlKQ0KcEJldGEgPC0gYmV0YVBvc3QoTUdTQV9yZXN1bHQpW3doaWNoLm1heChwUG9zdChNR1NBX3Jlc3VsdCkkZXN0aW1hdGUpLCBdJHZhbHVlDQoNCnRpdGxlIDwtIHBhc3RlMCgiTUdTQSBhbmFseXNpczogXG4gXG4gZXhwZWN0ZWQgYWN0aXZlIGdlbmUgc2V0czogIixwUG9zdCwiXG4gYWxwaGEgKGZhbHNlIHBvc2l0aXZlcyk6ICIsIHBBbHBoYSwgIlxuIGJldGEgKGZhbHNlIG5lZ2F0aXZlcyk6ICIscEJldGEpDQoNCiMgVEVYVA0KcGxvdCgxOjEwMCwgdHlwZT0ibiIsIHhheHQ9Im4iLCB5YXh0PSJuIiwgYnR5PSJuIiwgeGxhYj0iIiwgeWxhYj0iIikNCnRleHQoeD01MCwgeT01MCwgdGl0bGUgLCBjZXg9MS4yKQ0KDQojIyBET1RQTE9UDQoNCnRtcCA8LSBkYXRhLmZyYW1lKGdvX2lkID0gY29sbmFtZXMoR09fYW5ub3RhdGlvbnNfd2lkZSksIGVzdGltYXRlID1NR1NBX3Jlc3VsdEBzZXRzUmVzdWx0c1tbImVzdGltYXRlIl1dKQ0KIyBzb3J0KHRtcCRlc3RpbWF0ZSwgaW5kZXgucmV0dXJuPVRSVUUsIGRlY3JlYXNpbmc9VFJVRSkkaXhbMToxMF0gI3JldHVybnMgdGhlIGluZGV4IG9mIHRoZSB0b3AgMTAgc2NvcmluZyBzZXRzDQoNCnBsb3Qoc2VxKDE6ZGltKHRtcClbMV0pLA0KICAgICB0bXAkZXN0aW1hdGUsDQogICAgIHhsYWI9IiIsDQogICAgIHlsYWI9IlBvc3RlcmlvciBQcm9iYWJpbGl0eSBvZiBhY3RpdmF0aW9uIiwNCiAgICAgI3lsaW09YygwLDMuNiksDQogICAgIHhheHQgPSAibiIsICNyZW1vdmUgeCBheGlzIHRpa21hcmtzDQogICAgICNsYXM9MSwgI3RoaXMgaXMgaWdub3JlZCBpZiBkZWZpbmluZyBsYWJlbHMgbGF0ZXINCiAgICAgcGNoPTE2LA0KICAgICBjZXg9MSwNCiAgICAgY29sID0gaWZlbHNlKHNlcSgxOmRpbSh0bXApWzFdKSAlaW4lIHNvcnQodG1wJGVzdGltYXRlLCBpbmRleC5yZXR1cm49VFJVRSwgZGVjcmVhc2luZz1UUlVFKSRpeFsxOjEwXSwgImRvZGdlcmJsdWUiLCBhbHBoYSAoImJsYWNrIiwgMC4zKSkNCiAgICAgKQ0KYXhpcygxLCBzb3J0KHRtcCRlc3RpbWF0ZSwgaW5kZXgucmV0dXJuPVRSVUUsIGRlY3JlYXNpbmc9VFJVRSkkaXhbMToxMF0sbGFzPTIsIGNleC5heGlzPTAuNSwgZm9udD0yLCBsYWJlbHMgPSBjb2xuYW1lcyhHT19hbm5vdGF0aW9uc193aWRlKVtzb3J0KHRtcCRlc3RpbWF0ZSwgaW5kZXgucmV0dXJuPVRSVUUsIGRlY3JlYXNpbmc9VFJVRSkkaXhbMToxMF1dKQ0KdGl0bGUoIlBvc3RlcmlvciBwcm9iYWJpbGl0aWVzIG9mIGFjdGl2YXRpb24iKQ0KYWJsaW5lKGg9MC41LGNvbD0iZ3JleSIpDQojdGV4dChzb3J0KHRtcCRlc3RpbWF0ZSwgaW5kZXgucmV0dXJuPVRSVUUsIGRlY3JlYXNpbmc9VFJVRSkkaXhbMToxMF0sIHRtcCRlc3RpbWF0ZVtzb3J0KHRtcCRlc3RpbWF0ZSwgaW5kZXgucmV0dXJuPVRSVUUsIGRlY3JlYXNpbmc9VFJVRSkkaXhbMToxMF1dLTAuMDQsIGxhYmVscz1jb2xuYW1lcyhHT19hbm5vdGF0aW9uc193aWRlKVtzb3J0KHRtcCRlc3RpbWF0ZSwgaW5kZXgucmV0dXJuPVRSVUUsIGRlY3JlYXNpbmc9VFJVRSkkaXhbMToxMF1dLCBjZXg9MC43KQ0KDQojREVOU0lUWSBQTE9UDQoNCnBsb3QoZGVuc2l0eSh0bXAkZXN0aW1hdGUpLA0KICAgICBjb2w9ICJkb2RnZXJibHVlIiwNCiAgICAgbHdkPSAyLA0KICAgICBtYWluPSIiLA0KICAgICB4bGFiPSJQb3N0ZXJpb3IgcHJvYmFiaWxpdHkgb2YgYWN0aXZhdGlvbiIsDQogICAgIHlsYWI9Ik51bWJlciBvZiBHTyBzZXRzIFxuIHdpdGggZ2l2ZW4gcHJvYmFiaWxpdHkiLA0KICAgICAjeWxpbT1yYW5nZShwcmV0dHkoYygwLCAxKSkpDQogICAgICkNCmFibGluZSh2PTAuNSxjb2w9ImdyZXkiKQ0KdGl0bGUoIkRpc3RyaWJ1dGlvbiBvZiBwb3N0ZXJpb3IgYWN0aXZhdGlvbiBwcm9iYWJpbGl0aWVzIikNCg0KI0JBUlBMT1QNCg0Kc29ydGVkX3RtcCA8LSB0bXANCnNvcnRlZF90bXAkc2QgPC0gTUdTQV9yZXN1bHRAc2V0c1Jlc3VsdHNbWyJzdGQuZXJyb3IiXV0NCnNvcnRlZF90bXAkaW5kZXggPC0gc2VxKDE6ZGltKHNvcnRlZF90bXApWzFdKQ0Kc29ydGVkX3RtcCA8LSBzb3J0ZWRfdG1wW29yZGVyKHNvcnRlZF90bXAkZXN0aW1hdGUsIGRlY3JlYXNpbmcgPSBUUlVFKSxdDQojc29ydGVkX3RtcCA8LSBhcy5kYXRhLmZyYW1lKHNvcnQoc29ydGVkX3RtcCRlc3RpbWF0ZSwgaW5kZXgucmV0dXJuPVRSVUUsIGRlY3JlYXNpbmc9VFJVRSkpDQpzb3J0ZWRfdG1wJHJhbmsgPC0gc2VxKDE6ZGltKHNvcnRlZF90bXApWzFdKQ0KI2NvbG5hbWVzKHNvcnRlZF90bXApIDwtIGMoImVzdGltYXRlIiwgImluZGV4IiwgInJhbmsiKQ0KDQpwbG90KHNvcnRlZF90bXBbMToyMCxdJGVzdGltYXRlLA0KICAgICBzb3J0ZWRfdG1wWzE6MjAsXSRyYW5rLA0KICAgICB4bGFiPSJQb3N0ZXJpb3IgUHJvYmFiaWxpdHkgb2YgYWN0aXZhdGlvbiBcbiArLy0gU3RhbmRhcmQgRXJyb3IiLA0KICAgICB5bGFiPSIiLA0KICAgICAjeWxpbT1jKDEsMjApLA0KICAgICB5bGltID0gcmV2KHJhbmdlKHNvcnRlZF90bXBbMToyMCxdJHJhbmspKSwgI3NvIHRoYXQgaGlnaGVyIHJhbmtzIChsb3dlciBwb3NpdGlvbnMpIGFyZSBhdCB0aGUgYm90dG9tDQogICAgIHlheHQgPSAibiIsICNyZW1vdmUgeCBheGlzIHRpa21hcmtzDQogICAgICNsYXM9MSwgI3RoaXMgaXMgaWdub3JlZCBpZiBkZWZpbmluZyBsYWJlbHMgbGF0ZXINCiAgICAgcGNoPTE2LA0KICAgICBjZXg9MSwNCiAgICAgY29sID0gaWZlbHNlKHNvcnRlZF90bXAkaW5kZXggJWluJSBzb3J0KHRtcCRlc3RpbWF0ZSwgaW5kZXgucmV0dXJuPVRSVUUsIGRlY3JlYXNpbmc9VFJVRSkkaXhbMToxMF0sICJkb2RnZXJibHVlIiwgYWxwaGEgKCJibGFjayIsIDEpKQ0KICAgICApDQpheGlzKDIsIHNvcnRlZF90bXBbMToyMCxdJHJhbmssbGFzPTIsIA0KICAgICBjZXguYXhpcz0wLjUsIA0KICAgICBmb250PTIsIA0KICAgICBsYWJlbHMgPSBjb2xuYW1lcyhHT19hbm5vdGF0aW9uc193aWRlKVtzb3J0ZWRfdG1wWzE6MjAsXSRpbmRleF0pDQp0aXRsZSgiUG9zdGVyaW9yIHByb2JhYmlsaXRpZXMgb2YgYWN0aXZhdGlvbiIpDQojIEFkZCBlcnJvciBiYXJzDQojaHR0cHM6Ly93d3cuYmVuamFtaW5iZWxsLmNvLnVrLzIwMTkvMDQvaG93LXRvLWFkZC1lcnJvci1iYXJzLWluLXIuaHRtbA0KYXJyb3dzKHgwPXNvcnRlZF90bXBbMToyMCxdJGVzdGltYXRlIC0gc29ydGVkX3RtcFsxOjIwLF0kc2QsIA0KICAgICAgIHkwPXNvcnRlZF90bXBbMToyMCxdJHJhbmssIA0KICAgICAgIHgxPXNvcnRlZF90bXBbMToyMCxdJGVzdGltYXRlKyBzb3J0ZWRfdG1wWzE6MjAsXSRzZCwgDQogICAgICAgeTE9c29ydGVkX3RtcFsxOjIwLF0kcmFuaywgDQogICAgICAgY29kZT0zLCANCiAgICAgICBhbmdsZT05MCwgDQogICAgICAgbGVuZ3RoPTAuMSwNCiAgICAgICBjb2wgPSAiZ3JheSIpDQoNCmBgYA0KDQo8YnIvPiBGb3IgdGhlIHRvcCBzY29yaW5nIHBhdGh3YXlzLCBiZWxvdyB0aGUgbGlzdCBvZiB0aGUgYWN0dWFsIGdlbmVzIGJlbG9uZ2luZyB0byB0aGF0IHBhdGh3YXkgdGhhdCB3ZXJlIGZvdW5kIGluIG91ciBsaXN0IG9mIGRpZmZlcmVudGlhbGx5LWV4cHJlc3NlZCBnZW5lczoNCg0KDQpgYGB7ciwgZWNobz1GQUxTRSwgaW5jbHVkZT1GQUxTRX0NCiNmb3IgdGhlIHRvcCBwYXRod2F5cywgcHJpbnQgdGhlIGdlbmVzIHRoYXQgaGF2ZSBiZWVuIGZvdW5kIGFtb25nc3QgREUNCiNzb3J0ZWRfdG1wWzE6NSwxXSAjaXMgdGhlIGNvbG5hbWVzIG9mIEdPLWFubm90YXRpb25fd2lkZSB3ZSBoYXZlIHRvIGV4dHJhY3QgZ2VuZSBjb2RlcyBmcm9tDQoNCiNmb3IgZWFjaCBvZiB0aGUgdG9wIChlLmcuKSAxNSByYW5raW5nIEdPIHBhdGh3YXlzDQpmb3IgKGkgaW4gc2VxKDE6MTApKSB7DQogIHBhdGh3YXlfZ2VuZXMgPC0gR09fYW5ub3RhdGlvbnNfd2lkZVssc29ydGVkX3RtcFtpLDFdXVshaXMubmEoR09fYW5ub3RhdGlvbnNfd2lkZVssc29ydGVkX3RtcFtpLDFdXSldICN0YWtlIHRoZSBwYXRod2F5IHdpdGggdGhhdCBsYWJlbCwgYW5kIHRoZSBnZW5lcyB0aGF0IGJlbG9uZyB0byBpdCAoaS5lLiB0aGUgbm9uLU5BIGVudHJpZXMpDQogIGV4cHJlc3NlZCA8LSBpbnRlcnNlY3QocGF0aHdheV9nZW5lcywgREVfZ2VuZXMpICNmaW5kIHdoaWNoIG9mIGFsbCBwYXRod2F5cyBnZW5lcyBhcmUgYWN0dWFsbHkgdGhvc2UgZm91bmQgYW1vbmdzdCBERSBnZW5lcw0KICAjcHJpbnQodG9wX3RhYmxlW3RvcF90YWJsZSRlbnNlbWJsX2dlbmVfaWQgJWluJSBleHByZXNzZWQsIGMoIkZDIiwgImFkai5QLlZhbCIsICJlbnNlbWJsX2dlbmVfaWQiLCAiZGVzY3JpcHRpb24iLCAiQXZlRXhwciIsICJDSS5MIiwgIkNJLlIiKV0pDQogIHByaW50KGthYmxlKHRvcF90YWJsZVt0b3BfdGFibGUkZW5zZW1ibF9JRCAlaW4lIGV4cHJlc3NlZCwgYygiRkMiLCAiYWRqLlAuVmFsIiwgImVuc2VtYmxfSUQiLCAibWVyZ2VkX2Rlc2NyaXB0aW9uIiwgIkF2ZUV4cHIiLCAiQ0kuTCIsICJDSS5SIildLCANCiAgICAgICAgICAgICAgY2FwdGlvbj0gcGFzdGUwKCJHZW5lcyBvZiBHTyBzZXQ6WyIsc29ydGVkX3RtcFtpLDFdLCJdIHByZXNlbnQgYW1vbnN0IGdlbmVzIG9mIGludGVyZXN0IikpKQ0KICANCn0NCiAgICAgDQpgYGANCg0KIyMjIyMgX19Db21wZXRpdGl2ZSBHZW5lIFNldCBUZXN0cyAoTVJHU0UpX18NCg0KYGBge3IsIGVjaG89RkFMU0V9DQojR2VuZSBzZXQgdGVzdHMgd2VyZSBhcHBsaWVkIHRvIHN0YXRpc3RpY2FsIGNvbnRyYXN0cyB1c2luZyBmdW5jdGlvbiBnZW5lU2V0VGVzdDE0IGZyb20gdGhlIGxpbW1hIHBhY2thZ2UgKHdpdGgNCiNwYXJhbWV0ZXJzIGFsdGVybmF0aXZlPSJtaXhlZCIsIHR5cGU9InQiIGFuZCByYW5rcy5vbmx5PVRSVUUpDQoNCiNUaGUgbWV0aG9kIHRlc3RzIHdoZXRoZXIgYSBzZXQgb2YgZ2VuZXMgaXMgaGlnaGx5IHJhbmtlZCByZWxhdGl2ZSB0byBvdGhlciBnZW5lcyBpbiB0ZXJtcyBvZiB0aGVpciB0LXN0YXRpc3RpY3MgKGNvbXBldGl0aXZlIGFwcHJvYWNoKS4NCiNUaGUgYXBwcm9hY2ggd2FzIGFwcGxpZWQgdG8gdGhlIEdlbmUgT250b2xvZ3kgdGVybXMgKGZyb20gdGhlIOKAnEJpb2xvZ2ljYWwgUHJvY2Vzc+KAnSB0cmVlKSBhbmQgdGhlIEtFR0cgcGF0aHdheXMgc2VwYXJhdGVseS4NCiNPbmx5IHNldHMgd2l0aCBhdCBsZWFzdCAyNSBnZW5lcyBhbmQgYXQgbW9zdCAxMDAwIHdlcmUgY29uc2lkZXJlZC4NCg0KDQojcnVuIGEgY29tcGV0aXRpdmUgZ2VuZSB0ZXN0IGZvciBldmVyeSBHT19zZXQgd2UgaGF2ZSBkb3dubG9hZGVkIGZyb20gZW5zZW1ibCAob2JqZWN0ICJHTyBhbm5vdGF0aW9ucyIgbWFkZSBlYXJsaWVyKQ0KI2Zyb206aHR0cHM6Ly9zdXBwb3J0LmJpb2NvbmR1Y3Rvci5vcmcvcC8xMDc1NTMvDQojVGhlIGNvbXBldGl0aXZlIGdlbmUgdGVzdCB3aWxsIHNob3cgbWUgd2ljaCBnZW5lIHNldCBpcyBtb3JlIGFmZmVjdGVkIHRoYW4gb3RoZXIgZ2VuZSBzZXRzIGJ5IHRoZSByZXNwb25zZS4gDQoNCkdPX2lkX2xpc3QgPC0gbGlzdCgpDQpHT19wdmFsdWVfbGlzdCA8LSBsaXN0KCkNCg0KZm9yIChHT19pZCBpbiB1bmlxdWUoR09fYW5ub3RhdGlvbnMkZ29faWQpKSB7DQogIA0KICAjcHJlcGFyZSByZXF1aXJlZCJpbmRleCIgb2JqZWN0DQogICNpbmRleCBpcyBhIFRSVUUvRkFMU0UgY29sdW1uIHRoZSBzYW1lIGxlbmd0aCBhcyB0aGUgZ2VuZXMgc3VibWl0dGVkLCB3aGljaCBpcyBUUlVFIGZvciBnZW5lcyBpbiBhIGdpdmVuIGdlbmVzZXQNCiAgI3JlbWVtYmVyIHRvIHN0YXJ0IGZyb20gYSBsaXN0IG9mIEdPIHNldHMgdGhhdCBoYXMgYWxsIGdlbmVzLCBub3QganVzdCB0aG9zZSBleHByZXNzZWQgaW4geW91ciBkYXRhc2V0DQogIEdPX2dlbmVzIDwtIEdPX2Fubm90YXRpb25zW0dPX2Fubm90YXRpb25zJGdvX2lkID09IEdPX2lkLCAiZW5zZW1ibF9nZW5lX2lkIl0NCg0KICAjbWFrZSBhIFRSVUUvRkFMU0UgdmVjdG9yIGZvciBlYWNoIHRvcHRhYmxlIGdlbmUgDQogIGluZGV4IDwtIHRvcF90YWJsZSRlbnNlbWJsX0lEICVpbiUgR09fZ2VuZXMNCiAgDQogICNydW4gZ2VuZVNldFRlc3QgdG8gb2J0YWluIHJlc3VsdGluZyBwdmFsdWUgZm9yIGVhY2ggR08gc2V0DQogICNvdXRwdXQgaXMgdGhlIHB2YWx1ZSAoY2FsY3VsYXRlZCBmcm9tIFdpY2xveG9uIHRlc3QpIHRoYXQgZ2VuZXMgb2YgR09zZXQgIlgiIGFyZSBoaWdoZXIgcmFua2VkIGluIHRoZSBjb250cmFzdCBzdGF0aXN0aWNzLCBjb21wYXJlZCB0byByYW5kb21seSBjaG9zZW4gZ2VuZXMgDQogIEdPX3B2YWx1ZSA8LSBnZW5lU2V0VGVzdChpbmRleCA9IGluZGV4LCANCiAgICAgICAgICAgIHN0YXRpc3RpY3MgPSBuYS5vbWl0KHRvcF90YWJsZSkkdCwgDQogICAgICAgICAgICBhbHRlcm5hdGl2ZSA9ICJtaXhlZCIsICAgICAgICNhbHRlcm5hdGl2ZSBoeXBvdGhlc2lzIGlzICJtaXhlZCIsIGRpcmVjdGlvbiBkb2VzIG5vdCBtYXR0ZXINCiAgICAgICAgICAgIHR5cGUgPSAidCIsICAgICAgICAgICAgICAgICAgI2kuZS4gc3RhdGlzdGljcyBhcmUgc2lnbmVkLCB0LWxpa2UNCiAgICAgICAgICAgIHJhbmtzLm9ubHkgPSBUUlVFICAgICAgICAgICAgI29ubHkgcmFua3Mgb2Ygb2JqZWN0ICJzdGF0aXN0aWNzIiB3aWxsIGJlIHVzZWQNCiAgICAgICAgICAgICkNCiAgDQogICNzdG9yZSBHT19pZCBhbmQgcHZhbHVlIGluIGxpc3RzDQogIEdPX2lkX2xpc3QgPC0gYXBwZW5kKEdPX2lkX2xpc3QsIEdPX2lkKQ0KICBHT19wdmFsdWVfbGlzdCA8LSBhcHBlbmQoR09fcHZhbHVlX2xpc3QsIEdPX3B2YWx1ZSkNCiAgDQp9DQpgYGANCg0KYGBge3IsIGVjaG89RkFMU0V9DQojY3JlYXRlIGEgZGF0YWZyYW1lIHdpdGggdGhlIPCdkZ0tdmFsdWVzIChjb2x1bW4gcC52YWx1ZSkgYW5kIEdPX2lkDQpDR1NUX3RhYmxlIDwtIGRhdGEuZnJhbWUobWF0cml4KHVubGlzdChHT19wdmFsdWVfbGlzdCksIG5yb3c9bGVuZ3RoKEdPX3B2YWx1ZV9saXN0KSwgYnlyb3c9VFJVRSkpDQpjb2xuYW1lcyhDR1NUX3RhYmxlKSA8LSAicC52YWx1ZSINCkNHU1RfdGFibGUkcC52YWx1ZSA8LSBhcy5udW1lcmljKENHU1RfdGFibGUkcC52YWx1ZSkNCg0KQ0dTVF90YWJsZSRpZCA8LSB1bmxpc3QoR09faWRfbGlzdCkNCg0KI0FkZCBudW1iZXIgb2YgcHJvYmUgc2V0cyBpbiB0aGUgZ2VuZSBzZXQgKGNvbHVtbiBuYikNCg0KI0FkZCBhbmQgaW5mb3JtYXRpb24gZm9yIGVhY2ggaWRlbnRpZmllZCBnZW5lIHNldCAoY29sdW1ucyBkYXRhYmFzZSwgYW5kIGRlc2NyaXB0aW9uKQ0KQ0dTVF90YWJsZSRkYXRhYmFzZSA8LSByZXAoIkdPIiwgZGltKENHU1RfdGFibGUpWzFdKQ0KDQpmb3IgKGlkIGluIENHU1RfdGFibGUkaWQpIHsNCiAgQ0dTVF90YWJsZVttYXRjaChpZCwgQ0dTVF90YWJsZSRpZCksImRlc2NyaXB0aW9uIl0gPC0gR09fYW5ub3RhdGlvbnNbbWF0Y2goaWQsIEdPX2Fubm90YXRpb25zJGdvX2lkKSAgLCJuYW1lXzEwMDYiXQ0KfQ0KDQoNCiMjQWRkIGZhbHNlIGRpc2NvdmVyeSByYXRlIGFkanVzdGVkIPCdkZ0tdmFsdWVzIChjb2x1bW4gRkRSKQ0KI2NhbGN1bGF0ZSBhZGp1c3RlZCBwIHZhbHVlcyBtYW51YWxseQ0KI29yZGVyIHB2YWx1ZXMgZnJvbSBzbWFsbGVzdCB0byBoaWdoZXN0DQpDR1NUX3RhYmxlIDwtIENHU1RfdGFibGVbb3JkZXIoQ0dTVF90YWJsZSRwLnZhbHVlKSxdDQpDR1NUX3RhYmxlJHJhbmsgPC0gc2VxLmludChucm93KENHU1RfdGFibGUpKQ0KDQojIGZpbmQgQkggY29ycmVjdGlvbiB0aHJlc2hvbGQgKGJhc2VkIG9uIGZvcm11bGEpLg0KI3dlIGFyZSBhY2NlcHRpbmcgYSBGRFIgb2YgIDUlIChwIHZhbHVlID0gMC4wNSkNCkNHU1RfdGFibGUkYWRqdXN0ZWRfcHZhbHVlIDwtIChDR1NUX3RhYmxlWywicmFuayJdL25yb3coQ0dTVF90YWJsZSkpKjAuMDUNCg0KI3JlbW92ZSByYW5rIGNvbHVtbiwgd2ljaCB3ZSBkbyBub3QgbmVlZCBhbnltb3JlDQpDR1NUX3RhYmxlIDwtIHN1YnNldChDR1NUX3RhYmxlLCBzZWxlY3QgPSAtYyhyYW5rKSkNCiNzb3J0IGJ5IGFkanVzdGVkIHAgdmFsdWUNCkNHU1RfdGFibGUgPC0gQ0dTVF90YWJsZVtvcmRlcihDR1NUX3RhYmxlJGFkanVzdGVkX3B2YWx1ZSksXQ0KDQojc2hvdyB0YWJsZQ0Ka2FibGUoQ0dTVF90YWJsZVsxOjMwLF0sIGNhcHRpb24gPSAiR08gZ2VuZSBzZXRzIGlkZW50aWZpZWQgYnkgdGhlIE1lYW4tUmFuayBHZW5lIFNldCBFbnJpY2htZW50IHRlc3RzIChNUkdTRSkgbWV0aG9kLCByYW5rZWQgYnkgYWRqdXN0ZWQgcC52YWx1ZSIpDQpgYGANCg0KDQpgYGB7ciwgZWNobz1GQUxTRSwgaW5jbHVkZT1GQUxTRX0NCiNmb3IgdGhlIHRvcCBwYXRod2F5cywgcHJpbnQgdGhlIGdlbmVzIHRoYXQgaGF2ZSBiZWVuIGZvdW5kIGFtb25nc3QgREUNCiNzb3J0ZWRfdG1wWzE6NSwxXSAjaXMgdGhlIGNvbG5hbWVzIG9mIEdPLWFubm90YXRpb25fd2lkZSB3ZSBoYXZlIHRvIGV4dHJhY3QgZ2VuZSBjb2RlcyBmcm9tDQoNCiNmb3IgZWFjaCBvZiB0aGUgdG9wIChlLmcuKSAxNSByYW5raW5nIEdPIHBhdGh3YXlzDQpmb3IgKGkgaW4gc2VxKDE6MzApKSB7DQogIHBhdGh3YXlfZ2VuZXMgPC0gR09fYW5ub3RhdGlvbnNbR09fYW5ub3RhdGlvbnMkZ29faWQgPT0gQ0dTVF90YWJsZSRpZFtpXSwiZW5zZW1ibF9nZW5lX2lkIl0gI3Rha2UgdGhlIHBhdGh3YXkgd2l0aCB0aGF0IGxhYmVsLCBhbmQgdGhlIGdlbmVzIHRoYXQgYmVsb25nIHRvIGl0IChpLmUuIHRoZSBub24tTkEgZW50cmllcykNCiAgI3BhdGh3YXlfZ2VuZXMgPC0gcGF0aHdheV9nZW5lc1tbMV1dDQogICNleHByZXNzZWQgPC0gaW50ZXJzZWN0KHBhdGh3YXlfZ2VuZXMsIERFX2dlbmVzKSAjZmluZCB3aGljaCBvZiBhbGwgcGF0aHdheXMgZ2VuZXMgYXJlIGFjdHVhbGx5IHRob3NlIGZvdW5kIGFtb25nc3QgREUgZ2VuZXMNCiAgI3ByaW50KHRvcF90YWJsZVt0b3BfdGFibGUkZW5zZW1ibF9nZW5lX2lkICVpbiUgZXhwcmVzc2VkLCBjKCJGQyIsICJhZGouUC5WYWwiLCAiZW5zZW1ibF9nZW5lX2lkIiwgImRlc2NyaXB0aW9uIiwgIkF2ZUV4cHIiLCAiQ0kuTCIsICJDSS5SIildKQ0KICBwcmludChrYWJsZSh0b3BfdGFibGVbdG9wX3RhYmxlJGVuc2VtYmxfSUQgJWluJSBwYXRod2F5X2dlbmVzLCBjKCJGQyIsICJhZGouUC5WYWwiLCAiZW5zZW1ibF9JRCIsICJtZXJnZWRfZGVzY3JpcHRpb24iLCAiQXZlRXhwciIsICJDSS5MIiwgIkNJLlIiKV0sIA0KICAgICAgICAgICAgICBjYXB0aW9uPSBwYXN0ZTAoIkdlbmVzIG9mIEdPIHNldDpbIixDR1NUX3RhYmxlJGRlc2NyaXB0aW9uW2ldLCJdIHByZXNlbnQgYW1vbnN0IGdlbmVzIG9mIGludGVyZXN0IikpKQ0KICANCn0NCiAgICANCg0KDQpgYGANCg0KV2UgY2FuIGRvIHRoZSBzYW1lIHdpdGggS0VHRyBwYXRod2F5cw0KDQpgYGB7ciwgZWNobz1GQUxTRX0NCg0KbG9hZCgiQzovL1VzZXJzL0RvY3Rvci9EZXNrdG9wL1JOQXNlcV9hbmFseXNlcy9kaWN0aW9uYXJ5X2dlbmUyS0VHR193aWRlLnJkcyIpDQpsb2FkKCJDOi8vVXNlcnMvRG9jdG9yL0Rlc2t0b3AvUk5Bc2VxX2FuYWx5c2VzL2RpY3Rpb25hcnlfS0VHRzJkZXNjcmlwdGlvbi5yZHMiKQ0KI3J1biBhIGNvbXBldGl0aXZlIGdlbmUgdGVzdCBmb3IgZXZlcnkgS0VHRyBzZXQgd2UgaGF2ZSBvYnRhaW5lZCBmcm9tIEtFR0cgKG9iamVjdCAiZGljdGlvbmFyeV9nZW5lMktFR0dfd2lkZSIgbWFkZSBlYXJsaWVyKQ0KI2Zyb206aHR0cHM6Ly9zdXBwb3J0LmJpb2NvbmR1Y3Rvci5vcmcvcC8xMDc1NTMvDQojVGhlIGNvbXBldGl0aXZlIGdlbmUgdGVzdCB3aWxsIHNob3cgbWUgd2ljaCBnZW5lIHNldCBpcyBtb3JlIGFmZmVjdGVkIHRoYW4gb3RoZXIgZ2VuZSBzZXRzIGJ5IHRoZSByZXNwb25zZS4gDQoNCktFR0dfaWRfbGlzdCA8LSBsaXN0KCkNCktFR0dfcHZhbHVlX2xpc3QgPC0gbGlzdCgpDQoNCmZvciAoS0VHR19pZCBpbiBjb2xuYW1lcyhkaWN0aW9uYXJ5X2dlbmUyS0VHR193aWRlKSkgew0KICANCiAgI3ByZXBhcmUgcmVxdWlyZWQiaW5kZXgiIG9iamVjdA0KICAjaW5kZXggaXMgYSBUUlVFL0ZBTFNFIGNvbHVtbiB0aGUgc2FtZSBsZW5ndGggYXMgdGhlIGdlbmVzIHN1Ym1pdHRlZCwgd2hpY2ggaXMgVFJVRSBmb3IgZ2VuZXMgaW4gYSBnaXZlbiBnZW5lc2V0DQogICNyZW1lbWJlciB0byBzdGFydCBmcm9tIGEgbGlzdCBvZiBHTyBzZXRzIHRoYXQgaGFzIGFsbCBnZW5lcywgbm90IGp1c3QgdGhvc2UgZXhwcmVzc2VkIGluIHlvdXIgZGF0YXNldA0KICBLRUdHX2dlbmVzIDwtIHVubGlzdChuYS5vbWl0KGRpY3Rpb25hcnlfZ2VuZTJLRUdHX3dpZGVbW0tFR0dfaWRdXSkpDQoNCiAgI21ha2UgYSBUUlVFL0ZBTFNFIHZlY3RvciBmb3IgZWFjaCB0b3B0YWJsZSBnZW5lIA0KICBpbmRleCA8LSB0b3BfdGFibGUkZW5zZW1ibF9JRCVpbiUgS0VHR19nZW5lcw0KICANCiAgI3J1biBnZW5lU2V0VGVzdCB0byBvYnRhaW4gcmVzdWx0aW5nIHB2YWx1ZSBmb3IgZWFjaCBHTyBzZXQNCiAgI291dHB1dCBpcyB0aGUgcHZhbHVlIChjYWxjdWxhdGVkIGZyb20gV2ljbG94b24gdGVzdCkgdGhhdCBnZW5lcyBvZiBHT3NldCAiWCIgYXJlIGhpZ2hlciByYW5rZWQgaW4gdGhlIGNvbnRyYXN0IHN0YXRpc3RpY3MsIGNvbXBhcmVkIHRvIHJhbmRvbWx5IGNob3NlbiBnZW5lcyANCiAgS0VHR19wdmFsdWUgPC0gZ2VuZVNldFRlc3QoaW5kZXggPSBpbmRleCwgDQogICAgICAgICAgICBzdGF0aXN0aWNzID0gdG9wX3RhYmxlJHQsIA0KICAgICAgICAgICAgYWx0ZXJuYXRpdmUgPSAibWl4ZWQiLCAgICAgICAjYWx0ZXJuYXRpdmUgaHlwb3RoZXNpcyBpcyAibWl4ZWQiLCBkaXJlY3Rpb24gZG9lcyBub3QgbWF0dGVyDQogICAgICAgICAgICB0eXBlID0gInQiLCAgICAgICAgICAgICAgICAgICNpLmUuIHN0YXRpc3RpY3MgYXJlIHNpZ25lZCwgdC1saWtlDQogICAgICAgICAgICByYW5rcy5vbmx5ID0gVFJVRSAgICAgICAgICAgICNvbmx5IHJhbmtzIG9mIG9iamVjdCAic3RhdGlzdGljcyIgd2lsbCBiZSB1c2VkDQogICAgICAgICAgICApDQogIA0KICAjc3RvcmUgR09faWQgYW5kIHB2YWx1ZSBpbiBsaXN0cw0KICBLRUdHX2lkX2xpc3QgPC0gYXBwZW5kKEtFR0dfaWRfbGlzdCwgS0VHR19pZCkNCiAgS0VHR19wdmFsdWVfbGlzdCA8LSBhcHBlbmQoS0VHR19wdmFsdWVfbGlzdCwgS0VHR19wdmFsdWUpDQogIA0KfQ0KYGBgDQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KI2NyZWF0ZSBhIGRhdGFmcmFtZSB3aXRoIHRoZSDwnZGdLXZhbHVlcyAoY29sdW1uIHAudmFsdWUpIGFuZCBHT19pZA0KQ0dTVF90YWJsZV9LRUdHIDwtIGRhdGEuZnJhbWUobWF0cml4KHVubGlzdChLRUdHX3B2YWx1ZV9saXN0KSwgbnJvdz1sZW5ndGgoS0VHR19wdmFsdWVfbGlzdCksIGJ5cm93PVRSVUUpKQ0KY29sbmFtZXMoQ0dTVF90YWJsZV9LRUdHKSA8LSAicC52YWx1ZSINCkNHU1RfdGFibGVfS0VHRyRwLnZhbHVlIDwtIGFzLm51bWVyaWMoQ0dTVF90YWJsZV9LRUdHJHAudmFsdWUpDQoNCkNHU1RfdGFibGVfS0VHRyRpZCA8LSB1bmxpc3QoS0VHR19pZF9saXN0KQ0KDQojQWRkIG51bWJlciBvZiBwcm9iZSBzZXRzIGluIHRoZSBnZW5lIHNldCAoY29sdW1uIG5iKQ0KDQojQWRkIGFuZCBpbmZvcm1hdGlvbiBmb3IgZWFjaCBpZGVudGlmaWVkIGdlbmUgc2V0IChjb2x1bW5zIGRhdGFiYXNlLCBhbmQgZGVzY3JpcHRpb24pDQpDR1NUX3RhYmxlX0tFR0ckZGF0YWJhc2UgPC0gcmVwKCJLRUdHIiwgZGltKENHU1RfdGFibGVfS0VHRylbMV0pDQoNCmZvciAoaWQgaW4gQ0dTVF90YWJsZV9LRUdHJGlkKSB7DQogIENHU1RfdGFibGVfS0VHR1ttYXRjaChpZCwgQ0dTVF90YWJsZV9LRUdHJGlkKSwiZGVzY3JpcHRpb24iXSA8LSBkaWN0aW9uYXJ5X0tFR0cyZGVzY3JpcHRpb25baWQsICJEZXNjcmlwdGlvbiJdDQp9DQoNCg0KIyNBZGQgZmFsc2UgZGlzY292ZXJ5IHJhdGUgYWRqdXN0ZWQg8J2RnS12YWx1ZXMgKGNvbHVtbiBGRFIpDQojY2FsY3VsYXRlIGFkanVzdGVkIHAgdmFsdWVzIG1hbnVhbGx5DQojb3JkZXIgcHZhbHVlcyBmcm9tIHNtYWxsZXN0IHRvIGhpZ2hlc3QNCkNHU1RfdGFibGVfS0VHRyA8LSBDR1NUX3RhYmxlX0tFR0dbb3JkZXIoQ0dTVF90YWJsZV9LRUdHJHAudmFsdWUpLF0NCkNHU1RfdGFibGVfS0VHRyRyYW5rIDwtIHNlcS5pbnQobnJvdyhDR1NUX3RhYmxlX0tFR0cpKQ0KDQojIGZpbmQgQkggY29ycmVjdGlvbiB0aHJlc2hvbGQgKGJhc2VkIG9uIGZvcm11bGEpLg0KI3dlIGFyZSBhY2NlcHRpbmcgYSBGRFIgb2YgIDUlIChwIHZhbHVlID0gMC4wNSkNCkNHU1RfdGFibGVfS0VHRyRhZGp1c3RlZF9wdmFsdWUgPC0gKENHU1RfdGFibGVfS0VHR1ssInJhbmsiXS9ucm93KENHU1RfdGFibGVfS0VHRykpKjAuMDUNCg0KI3JlbW92ZSByYW5rIGNvbHVtbiwgd2ljaCB3ZSBkbyBub3QgbmVlZCBhbnltb3JlDQpDR1NUX3RhYmxlX0tFR0cgPC0gc3Vic2V0KENHU1RfdGFibGVfS0VHRywgc2VsZWN0ID0gLWMocmFuaykpDQojc29ydCBieSBhZGp1c3RlZCBwIHZhbHVlDQpDR1NUX3RhYmxlX0tFR0cgPC0gQ0dTVF90YWJsZV9LRUdHW29yZGVyKENHU1RfdGFibGVfS0VHRyRhZGp1c3RlZF9wdmFsdWUpLF0NCiNhZGQgaW5kZXgNCkNHU1RfdGFibGVfS0VHRyRpbmRleCA8LSBzZXEoMTpkaW0oQ0dTVF90YWJsZV9LRUdHKVsxXSkNCg0KI3Nob3cgdGFibGUNCmthYmxlKENHU1RfdGFibGVfS0VHR1sxOjMwLF0sIGNhcHRpb24gPSAiS0VHRyBnZW5lIHNldHMgaWRlbnRpZmllZCBieSB0aGUgTWVhbi1SYW5rIEdlbmUgU2V0IEVucmljaG1lbnQgdGVzdHMgKE1SR1NFKSBtZXRob2QsIHJhbmtlZCBieSBhZGp1c3RlZCBwLnZhbHVlIikNCmBgYA0KDQpgYGB7ciwgZWNobz1GQUxTRSwgaW5jbHVkZT1GQUxTRX0NCiNmb3IgdGhlIHRvcCBwYXRod2F5cywgcHJpbnQgdGhlIGdlbmVzIHRoYXQgaGF2ZSBiZWVuIGZvdW5kIGFtb25nc3QgREUNCiNzb3J0ZWRfdG1wWzE6NSwxXSAjaXMgdGhlIGNvbG5hbWVzIG9mIEdPLWFubm90YXRpb25fd2lkZSB3ZSBoYXZlIHRvIGV4dHJhY3QgZ2VuZSBjb2RlcyBmcm9tDQoNCiNmb3IgZWFjaCBvZiB0aGUgdG9wIChlLmcuKSAxNSByYW5raW5nIEdPIHBhdGh3YXlzDQpmb3IgKGkgaW4gc2VxKDE6MTApKSB7DQogIHBhdGh3YXlfZ2VuZXMgPC0gbmEub21pdChkaWN0aW9uYXJ5X2dlbmUyS0VHR193aWRlWyxDR1NUX3RhYmxlX0tFR0dbaSwgImlkIl1dKSN0YWtlIHRoZSBwYXRod2F5IHdpdGggdGhhdCBsYWJlbCwgYW5kIHRoZSBnZW5lcyB0aGF0IGJlbG9uZyB0byBpdCAoaS5lLiB0aGUgbm9uLU5BIGVudHJpZXMpDQogIHBhdGh3YXlfZ2VuZXMgPC0gcGF0aHdheV9nZW5lc1tbMV1dDQogIGV4cHJlc3NlZCA8LSBpbnRlcnNlY3QocGF0aHdheV9nZW5lcywgREVfZ2VuZXMpICNmaW5kIHdoaWNoIG9mIGFsbCBwYXRod2F5cyBnZW5lcyBhcmUgYWN0dWFsbHkgdGhvc2UgZm91bmQgYW1vbmdzdCBERSBnZW5lcw0KICAjcHJpbnQodG9wX3RhYmxlW3RvcF90YWJsZSRlbnNlbWJsX2dlbmVfaWQgJWluJSBleHByZXNzZWQsIGMoIkZDIiwgImFkai5QLlZhbCIsICJlbnNlbWJsX2dlbmVfaWQiLCAiZGVzY3JpcHRpb24iLCAiQXZlRXhwciIsICJDSS5MIiwgIkNJLlIiKV0pDQogIHByaW50KGthYmxlKHRvcF90YWJsZVt0b3BfdGFibGUkZW5zZW1ibF9JRCAlaW4lIGV4cHJlc3NlZCwgYygiRkMiLCAiYWRqLlAuVmFsIiwgImVuc2VtYmxfSUQiLCAibWVyZ2VkX2Rlc2NyaXB0aW9uIiwgIkF2ZUV4cHIiLCAiQ0kuTCIsICJDSS5SIildLCANCiAgICAgICAgICAgICAgY2FwdGlvbj0gcGFzdGUwKCJHZW5lcyBvZiBHTyBzZXQ6WyIsQ0dTVF90YWJsZV9LRUdHW2ksICJkZXNjcmlwdGlvbiJdLCJdIHByZXNlbnQgYW1vbnN0IGdlbmVzIG9mIGludGVyZXN0IikpKQ0KICANCn0NCiAgICAgDQpgYGANCg0KDQojIyMjIyBlZmZlY3Qgb2YgTVBJIChNUEkgdnMgRE1TTykNCg0KDQpgYGB7ciwgZWNobz1GQUxTRSwgcmVzdWx0cyA9IEZBTFNFfQ0KI0xvYWQgdm9vbSBvYmplY3QgIkRHRV9vYmplY3RfZmlsdGVyZWRub3JtZWRfVm9vbWVkIiBmb3IgZGlmZmVyZW50aWFsIGV4cHJlc3Npb24gYW5hbHlzaXMsIGFuZCBhbm5vdGF0aW9uIGluZm8NCmxvYWQoIkQ6Ly9Bb2NlbGxhcmlzX0NQRl9NUElfVDMvU2F2ZWRfb2JqZWN0cy9ER0Vfb2JqZWN0X2ZpbHRlcmVkbm9ybWVkX1Zvb21lZC5yZHMiKQ0KbG9hZCgiRDovL0FvY2VsbGFyaXNfQ1BGX01QSV9UMy9TYXZlZF9vYmplY3RzL3NhbXBsZV9tZXRhZGF0YS5yZHMiKQ0KbG9hZCgiQzovL1VzZXJzL0RvY3Rvci9EZXNrdG9wL1JOQXNlcV9hbmFseXNlcy9hbm5vdGF0aW9uX2luZm9fTkNCSUVuc2VtYmxfY3VyYXRlZC5yZHMiKSANCg0KI3JlbmFtZSB0aGUgZGF0YWZyYW1lIGFzICJhbm5vdGF0aW9uX2luZm8iDQphbm5vdGF0aW9uX2luZm8gPC0gYW5ub3RhdGlvbl9pbmZvX05DQklFbnNlbWJsDQojcmVtb3ZlIHRoZSBjb2x1bW4gd2l0aCB0aGUgb3JpZ2luYWwgZGVzY3JpcHRpb24NCiNhbm5vdGF0aW9uX2luZm8gPC0gc3Vic2V0KGFubm90YXRpb25faW5mbywgc2VsZWN0ID0gLWMob3JpZ2luYWxfZGVzY3JpcHRpb24pKQ0KDQojcmVtb3ZlIHVudXNlZCB2YXJpYWJsZXMNCnJtKGFubm90YXRpb25faW5mb19OQ0JJRW5zZW1ibCkNCg0KIy0tLS0tLS0tLS0NCg0KIyBhcHBseSBsaW5lYXIgcmVncmVzc2lvbiBtb2RlbCB3aXRoIG1lYW4tdmFyaWFuY2UgcmVsYXRpb25zaGlwIHdlaWdodHMgY2FsY3VsYXRlZCBhYm92ZQ0KIyBsbUZpdCBmaXRzIGEgbGluZWFyIG1vZGVsIHVzaW5nIHdlaWdodGVkIGxlYXN0IHNxdWFyZXMgZm9yIGVhY2ggZ2VuZToNCiNleHRyYWN0IHRoZSBsaW5lYXIgbW9kZWxzIHRoYXQgaGFkIGJlZW4gZml0IGluIHRoZSB2b29tIG9iamVjdA0KZml0X3Jlc3VsdHMgPC0gbG1GaXQoREdFX29iamVjdF9maWx0ZXJlZG5vcm1lZF9Wb29tZWQpICN0aGlzIGlzIHRoZSBzYW1lIGFzIGRvaW5nICNmaXRfcmVzdWx0cyA8LSBsbUZpdChER0Vfb2JqZWN0X2ZpbHRlcmVkbm9ybWVkX1Zvb21lZCwgd2VpZ2h0cz1ER0Vfb2JqZWN0X2ZpbHRlcmVkbm9ybWVkX1Zvb21lZFtbIndlaWdodHMiXV0pDQoNCiNzYW1lIGFzIGRvaW5nIGxtKCkgaW5kaXZpZHVhbGx5IG9uIGVhY2ggZ2VuZSAoY2FuIGFsc28gc3VwcGx5IGhlcmUgdGhlIG1vZGVsIG1hdHJpeCwgYnV0IGFscmVhZHkgaW5jb3Jwb3JhdGVkIHRocm91Z2ggdm9vbWluZykNCmhlYWQoY29lZihmaXRfcmVzdWx0cykpDQpgYGANCg0KDQpgYGB7ciBlY2hvPUZBTFNFLCBmaWcuaGVpZ2h0PTIuNSwgZmlnLndpZHRoPTksIHdhcm5pbmc9VFJVRSwgcGFnZWQucHJpbnQ9RkFMU0V9DQojQ29tcHV0ZSBjb21wYXJpc29ucyBvZiBpbnRlcmVzdA0KDQojQ29tcGFyaXNvbnMgYmV0d2VlbiBncm91cHMgKGxvZyBmb2xkLWNoYW5nZXMpIGFyZSBvYnRhaW5lZCBhcyBjb250cmFzdHMgb2YgdGhlc2UgZml0dGVkIGxpbmVhciBtb2RlbHM6DQpjb250cmFzdF9tYXRyaXggPC0gbWFrZUNvbnRyYXN0cyh0cmVhdG1lbnRNUEkgIC0gdHJlYXRtZW50RE1TTyAsICAjIHBvc2l0aXZlIGxvZ2NoYW5nZXMgd2lsbCBiZSBoaWdoZXIgaW4gUzQsIG5lZ2F0aXZlIHdpbGwgYmUgaGlnaGVyIGluIFMxDQogICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGNvbG5hbWVzKGNvZWYoZml0X3Jlc3VsdHMpKSkNCiNzaG93IG5ld2x5IGNyZWF0ZWQgY29udHJhc3QgbWF0cml4DQpjb250cmFzdF9tYXRyaXggICMgcG9zaXRpdmUgbG9nY2hhbmdlcyB3aWxsIGJlIGhpZ2hlciBpbiBTNCwgbmVnYXRpdmUgd2lsbCBiZSBoaWdoZXIgaW4gUzENCg0KI2FkZCB0aGUgY29udHJhc3QgbWF0cml4IHRvIG91ciBmaXQgb2JqZWN0DQojIG5lZWQgdG8gZG8gbmV3IG9iamVjdHMgb3IgaXQgY2hlbmdlcyAgY29lZmZpY2llbnRzIGluc3RlYWQ/DQpmaXRfcmVzdWx0c19jb250cmFzdGVkIDwtIGNvbnRyYXN0cy5maXQoZml0X3Jlc3VsdHMsIGNvbnRyYXN0X21hdHJpeCkNCg0KI0VtcGlyaWNhbCBCYXllcyBzbW9vdGhpbmcgb2Ygc3RhbmRhcmQgZXJyb3JzIChzaHJpbmtzIHN0YW5kYXJkIGVycm9ycyB0aGF0IGFyZSBtdWNoIGxhcmdlciBvciBzbWFsbGVyIHRoYW4gdGhvc2UgZnJvbSBvdGhlciBnZW5lcyB0b3dhcmRzIHRoZSBhdmVyYWdlIHN0YW5kYXJkIGVycm9yKSAoc2VlIGh0dHBzOi8vd3d3LmRlZ3J1eXRlci5jb20vZG9pLzEwLjIyMDIvMTU0NC02MTE1LjEwMjcpDQpmaXRfcmVzdWx0c19jb250cmFzdGVkIDwtIGVCYXllcyhmaXRfcmVzdWx0c19jb250cmFzdGVkKSAjd2hlbiBhcHBsaWVkIHRvIHRoZSBvdXRwdXQgb2YgbG1GaXQoKSwgcGVyZm9ybXMgdGhlIHBvb2xlZCBlc3RpbWF0aW9uIG9mIHN0YW5kYXJkIGVycm9ycyB0aGF0IHJlc3VsdHMgaW4gdGhlIG1vZGVyYXRlZCB0LXN0YXRpc3RpY3MgYW5kIHJlc3VsdGluZyBwLXZhbHVlcy4NCg0KI3AuYWRqdXN0IChidXQgdGhpcyB3aWxsIGJlIGRvbmUgYXV0b21hdGljYWxseSBieSBUb3BUYWJsZSBmdW5jdGlvbikNCiNpbmRpdi5QLnZhbHVlczwtYXBwbHkodG1wW1sicC52YWx1ZSJdXSwgMiwgcC5hZGp1c3QsIG1ldGhvZD0iQkgiKQ0KI3RtcFtbIkJILmFkanVzdGVkLnB2YWx1ZSJdXSA8LSBpbmRpdi5QLnZhbHVlcw0KDQoNCiNyZW1vdmUgdW51c2VkIHZhcmlhYmxlcw0Kcm0oZml0X3Jlc3VsdHMsIERHRV9vYmplY3RfZmlsdGVyZWRub3JtZWRfVm9vbWVkKQ0KYGBgDQo8YnIvPg0KQmVsb3csIGEgbGlzdCBvZiBhbGwgdGhlIGdlbmVzIHRoYXQgYXBwZWFyIHNpZ25pZmljYW50bHkgZGlmZmVyZW50bHkgZXhwcmVzc2VkIGJldHdlZW4gdHJlYXRtZW50IGFuZCBjb250cm9sIChpbiBlaXRoZXIgZGlyZWN0aW9uOyBfX1RhYmxlIDFfXykuIEluIF9fVGFibGUgMl9fLCB0aGUgc3ViZXN0IG9mIHNpZ25pZmljYW50bHkgY2hhbmdpbmcgZ2VuZXMgd2hvc2UgZm9sZC1jaGFuZ2UgaXMgYmlnZ2VyIHRoYW4gMmZvbGRzIChpbiBlaXRoZXIgZGlyZWN0aW9uKS4gVGhlc2UgZ2VuZXMgYXJlIHJhbmtlZCBpbiBvcmRlciBvZiBkZWNyZWFzaW5nIGZvbGQgY2hhbmdlLiA8YnIvPg0KDQpgYGB7ciwgZWNobz1GQUxTRX0NCiNXaGF0IGdlbmVzIGFyZSBtb3N0IGRpZmZlcmVudGlhbGx5IGV4cHJlc3NlZD8NCmZ1bGxfdG9wX3RhYmxlIDwtIHRvcFRhYmxlKGZpdF9yZXN1bHRzX2NvbnRyYXN0ZWQsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgc29ydC5ieSA9ICJsb2dGQyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgbiA9IEluZiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICBhZGp1c3QubWV0aG9kPSJCSCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maW50PTAuOTUsICNub3RlIHRoYXQgdGhlc2UgYXJlIG5vdCBhZGp1c3RlZCBmb3IgbXVsdGlwbGUgdGVzdGluZyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICNwLnZhbHVlPTAuMDUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICkNCg0KI2NyZWF0ZSBjb2x1bW4gdGhhdCBzaG93cyBsb2dGb2xkQ2hhbmdlIGFzIHRoZSBGb2xkIENoYW5nZQ0KZnVsbF90b3BfdGFibGVbIkZDIl0gPC0gc2lnbihmdWxsX3RvcF90YWJsZVsibG9nRkMiXSkqMl5hYnMoZnVsbF90b3BfdGFibGVbImxvZ0ZDIl0pDQoNCiNzYXZlIGxpc3QNCiNzYXZlKGZ1bGxfdG9wX3RhYmxlLCBmaWxlID0gIkQ6Ly9Bb2NlbGxhcmlzX0NQRl9NUElfVDMvU2F2ZWRfb2JqZWN0cy9mdWxsX3RvcF90YWJsZV9NUEl2c0RNU08ucmRzIikNCiNsb2FkKGZpbGUgPSAiQzovL1VzZXJzL0RvY3Rvci9EZXNrdG9wL1JOQXNlcV9hbmFseXNlcy9Bb2NlbGxhcmlzX2d1dF9tZXRhbW9ycGhvc2lzX2xpdmVyL1NhdmVkX29iamVjdHMvZnVsbF90b3BfdGFibGVfUzR2c1MxLnJkcyIpDQpgYGANCg0KYGBge3IsIGVjaG89RkFMU0V9DQojZmluZCBnZW5lcyB3aXRoIGFkanVzdGVkIHB2YWx1ZQ0Kc2lnbmlmaWNhbnQgPC0gZnVsbF90b3BfdGFibGUkYWRqLlAuVmFsIDwgMC4wNQ0KI3N1YnNldCBnZW5lcyB0aGF0IGFyZSBzaWduaWZpY2FudGx5IHVwcmVndWxhdGVkDQp1cHJlZ3VsYXRlZCA8LSBzaWduaWZpY2FudCAmIHNpZ24oZnVsbF90b3BfdGFibGUkRkMpID09IDENCiNzdWJlc3QgZ2VuZSB0aGF0IGFyZSBzaWduaWZpY2FudGx5IGRvd25yZWd1bGF0ZWQNCmRvd25yZWd1bGF0ZWQgPC0gc2lnbmlmaWNhbnQgJiBzaWduKGZ1bGxfdG9wX3RhYmxlJEZDKSA9PSAtMQ0KI2ZpbmQgZ2VuZXMgdGhhdCBjaGFuZ2UgbW9yZSB0aGFuIDJ4IChsb2cyKEZDKT49MSBvciAtMSkNCmNoYW5naW5nIDwtIChzaWduKGZ1bGxfdG9wX3RhYmxlJEZDKSpsb2cyKGFicyhmdWxsX3RvcF90YWJsZSRGQykpID4gMSB8IChzaWduKGZ1bGxfdG9wX3RhYmxlJEZDKSpsb2cyKGFicyhmdWxsX3RvcF90YWJsZSRGQykpKSA8IC0xKQ0KDQoNCiNnZW5lcyB0aGF0IGFyZSBuZWl0aGVyIHNpZ25pZmljYW50IG5vciBjaGFuZ2luZw0KbmVpdGhlciA8LSAhc2lnbmlmaWNhbnQgJiAhY2hhbmdpbmcNCiNnZW5lcyB0aGF0IGFyZSBjaGFuZ2luZyBidXQgbm90IHNpZ25pZmljYW50DQpub3RzaWduaWZpY2FudF9oaWdoIDwtICFzaWduaWZpY2FudCAmIGNoYW5naW5nDQojZ2VuZXMgdGhhdCBhcmUgc2lnbmlmaWNhbnQgYnV0IG5vdCBjaGFuZ2luZw0Kc2lnbmlmaWNhbnRfbG93IDwtIHNpZ25pZmljYW50ICYgIWNoYW5naW5nDQojZmluZCBnZW5lcyB0aGF0IGFyZSBib3RoIHNpZ25pZmljYW50IGFuZCBjaGFuZ2luZw0KYm90aCA8LSBzaWduaWZpY2FudCAmIGNoYW5naW5nDQpgYGANCg0KYGBge3IsIGVjaG89RkFMU0V9DQojYWRqdXN0IGNvbmZpZGVuY2UgaW50ZXJ2YWxzIGlmIHdlIGFyZSB0byBvbmx5IHNlbGVjdCBhIHN1YnNldCBvZiBnZW5lcyAoaW4gb3VyIGNhc2UsIHNpZ25pZmljYW50IGdlbmVzKQ0KI3NlZSBodHRwczovL21vbmFzaGJpb2luZm9ybWF0aWNzcGxhdGZvcm0uZ2l0aHViLmlvL3ItbGluZWFyLWFiYWNiczIwMTgvdG9waWNzL2xpbmVhcl9tb2RlbHNfYWJhY2JzMjAxOC5odG1sDQojZmluZCBnZW5lcyB3aGljaCB3ZSBjb25zaWRlciAic2VsZWN0ZWQiIChzaWduaWZpY2FudCwgb3Igc2lnbmlmaWNhbnQgQU5EIGxvZzIgY2hhbmdpbmcpDQoNCnByb3BfYm90aCA8LSBtZWFuKGNoYW5naW5nKSAjInNpZ25pZmljYW50IGlzIGEgMC8xIGJvb2xlYW4gc28gdGhlIG1lYW4gaXMgdGhlIHByb3BvcnRpb24gDQojZG91YmxlIGNoZWNrIGhlcmUgb24gd2h5IHVzaW5nIG1lYW4oYm90aCkgZ2l2ZXMgbm9uLXNpZ25pZmljYW50IENJcyB0aG91Z2ggdGhlIGFkai5wLnZhbHVlIGlzIHNpZ25pZmljYW50Lg0KZmNyX2NvbmZpbnQgPC0gMSAtIDAuMDUqcHJvcF9ib3RoDQojc28gbm93IHJlcGxhY2UgdGhlIGNvbmZpZGVuY2UgaW50ZXJ2YWwgdmFsdWVzDQoNCmZ1bGxfdG9wX3RhYmxlIDwtIHRvcFRhYmxlKGZpdF9yZXN1bHRzX2NvbnRyYXN0ZWQsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgc29ydC5ieSA9ICJsb2dGQyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgbiA9IEluZiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICBhZGp1c3QubWV0aG9kPSJCSCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maW50PWZjcl9jb25maW50LCAjdGhlc2UgYXJlIG5vdyBhZGp1c3RlZCwgd2hlbiB3ZSBhcmUganVzdCBjb25zaWRlcmluZyB0aGUgc2lnbmlmaWNhbnQgZ2VuZXMNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICNwLnZhbHVlPTAuMDUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICkNCg0KI29ubHkga2VlcCByb3cgcGFzdCBwLnZhbHVlIHRocmVzaG9sZA0KI3RvcC50YWJsZSA8LSB0b3AudGFibGVbdG9wLnRhYmxlJGFkai5QLlZhbCA8PSAwLjUsIF0NCiNjcmVhdGUgY29sdW1uIHRoYXQgc2hvd3MgbG9nRm9sZENoYW5nZSBhcyB0aGUgRm9sZCBDaGFuZ2UNCmZ1bGxfdG9wX3RhYmxlWyJGQyJdIDwtIHNpZ24oZnVsbF90b3BfdGFibGVbImxvZ0ZDIl0pKjJeYWJzKGZ1bGxfdG9wX3RhYmxlWyJsb2dGQyJdKQ0KDQoNCiNvbmx5IGtlZXAgY29sdW1ucyB3ZSBhcmUgaW50ZXJlc3RlZCBpbg0KdG9wX3RhYmxlIDwtIGZ1bGxfdG9wX3RhYmxlW2MoImxvZ0ZDIiwgIkZDIiwgIlAuVmFsdWUiLCJhZGouUC5WYWwiLCJlbnRyZXpfSUQiLCAibWVyZ2VkX3N5bWJvbCIsIm1lcmdlZF9kZXNjcmlwdGlvbiIsImVuc2VtYmxfZGVzY3JpcHRpb24iLCAiQXZlRXhwciIsICJDSS5MIiwgIkNJLlIiLCJ0IildDQoNCiNyZW1vdmUgcm93bmFtZXMgKG5vdyByZWR1bmRhbnQpDQpyb3duYW1lcyh0b3BfdGFibGUpIDwtIE5VTEwNCg0KZm9ybWF0dGFibGUodG9wX3RhYmxlW3RvcF90YWJsZSRlbnRyZXpfSUQgJWluJSB0b3BfdGFibGUkZW50cmV6X0lEW2JvdGggJiB1cHJlZ3VsYXRlZF0sIF1bMToyMCxdLCANCiAgICAgICAgICAgICBjYXB0aW9uID0iVG9wMjAgZ2VuZXMgdXByZWd1bGF0ZWQgZ2VuZXMgKENQRik7IEZDPjIsIGFkai5wIDwwLjA1OyByYW5rZWQgYnkgbG9nRkMiLA0KICAgICAgICAgICAgI2FsaWduID1jKCJjIiwibCIsICJsIiwgImMiKSwgDQogICAgICAgICAgICBsaXN0KCNgZW50cmV6X0lEYCA9IGZvcm1hdHRlcigic3BhbiIsIA0KICAgICAgICAgICAgICAgICMgICAgICAgICAgICAgICAgICAgICAgc3R5bGUgPSB4IH4gc3R5bGUoDQogICAgICAgICAgICAgICAgIyAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yID0gIiNBOUE5QTkiLCBmb250LndlaWdodCA9ICJib2xkIikNCiAgICAgICAgICAgICAgICAjICAgICAgICAgICAgICAgICAgICAgICksIA0KICAgICAgICAgICAgICAgICBgbG9nRkNgPSBjb2xvcl90aWxlKE5BLCJkb2RnZXJibHVlIikNCg0KICAgICAgICAgICAgICAgICApDQogICAgICAgICAgICApDQoNCg0KIyBsaXN0IHRvcCBnZW5lcyBoaWdoZXIgaW4gR3V0IHR1YmUNCiNrYWJsZSh0b3BfdGFibGVbdG9wX3RhYmxlJGVudHJlel9JRCAlaW4lIHRvcF90YWJsZSRlbnRyZXpfSURbYm90aCAmIGRvd25yZWd1bGF0ZWRdLCBdWzE6MjAsXSwgY2FwdGlvbiA9ICJUb3AyMCBkb3ducmVndWxhdGVkIGdlbmVzIChDUEYpOyBGQzwxLzIsIGFkai5wIDwwLjA1OyByYW5rZWQgYnkgbG9nRkMiKQ0KDQoNCmZvcm1hdHRhYmxlKHRvcF90YWJsZVt0b3BfdGFibGUkZW50cmV6X0lEICVpbiUgdG9wX3RhYmxlJGVudHJlel9JRFtib3RoICYgZG93bnJlZ3VsYXRlZF0sIF1bMToyMCxdLCANCiAgICAgICAgICAgICBjYXB0aW9uID0iVG9wMjAgZG93bnJlZ3VsYXRlZCBnZW5lcyAoQ1BGKTsgRkM8MS8yLCBhZGoucCA8MC4wNTsgcmFua2VkIGJ5IGxvZ0ZDIiwNCiAgICAgICAgICAgICNhbGlnbiA9YygiYyIsImwiLCAibCIsICJjIiksIA0KICAgICAgICAgICAgbGlzdCgjYGVudHJlel9JRGAgPSBmb3JtYXR0ZXIoInNwYW4iLCANCiAgICAgICAgICAgICAgICAjICAgICAgICAgICAgICAgICAgICAgIHN0eWxlID0geCB+IHN0eWxlKA0KICAgICAgICAgICAgICAgICMgICAgICAgICAgICAgICAgICAgICAgICBjb2xvciA9ICIjQTlBOUE5IiwgZm9udC53ZWlnaHQgPSAiYm9sZCIpDQogICAgICAgICAgICAgICAgIyAgICAgICAgICAgICAgICAgICAgICApLCANCiAgICAgICAgICAgICAgICAgYGxvZ0ZDYD0gY29sb3JfdGlsZSgibGlnaHRjb3JhbCIsIE5BKQ0KDQogICAgICAgICAgICAgICAgICkNCiAgICAgICAgICAgICkNCg0KDQojcmVtb3ZlIHVudXNlZCB2YXJpYWJsZXMNCnJtKHByb3BfYm90aCwgZmNyX2NvbmZpbnQgKQ0KYGBgDQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KTVBJX3VwcmVndWxhdGVkIDwtIHRvcF90YWJsZVt0b3BfdGFibGUkZW50cmV6X0lEICVpbiUgdG9wX3RhYmxlJGVudHJlel9JRFtib3RoICYgdXByZWd1bGF0ZWRdLCBdWyw1XQ0KTVBJX2Rvd25yZWd1bGF0ZWQ8LSB0b3BfdGFibGVbdG9wX3RhYmxlJGVudHJlel9JRCAlaW4lIHRvcF90YWJsZSRlbnRyZXpfSURbYm90aCAmIGRvd25yZWd1bGF0ZWRdLCBdWyw1XQ0KI3NhdmUoTVBJX3VwcmVndWxhdGVkLCBmaWxlID0gIkQ6Ly9Bb2NlbGxhcmlzX0NQRl9NUElfVDMvU2F2ZWRfb2JqZWN0cy9NUElfdXByZWd1bGF0ZWRfZ2VuZXMucmRzIikNCiNzYXZlKE1QSV9kb3ducmVndWxhdGVkLCBmaWxlID0gIkQ6Ly9Bb2NlbGxhcmlzX0NQRl9NUElfVDMvU2F2ZWRfb2JqZWN0cy9NUElfZG93bnJlZ3VsYXRlZF9nZW5lcy5yZHMiKQ0KYGBgDQoNCg0KDQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KI0xldCB1cyBwcmludCBhIHN1bW1hcnkgcmVwcmVzZW50YXRpb24gb2YgdGhlIGRpZmZlcmVudGlhbGx5IGV4cHJlc3NlZCBnZW5lcw0KcGFzdGUwKHN1bW1hcnkoY2hhbmdpbmcgJiBzaWduaWZpY2FudClbM10gLCIgZGlmZmVyZW50aWFsbHkgZXhwcmVzc2VkIGdlbmVzIChQIDwwLjA1LCBGQzwxLzIgT1IgRkM+Mik6IikNCnBhc3RlMChzdW1tYXJ5KGNoYW5naW5nICYgdXByZWd1bGF0ZWQpWzNdICwiIGdlbmVzIHVwcmVndWxhdGVkIGJ5IE1QSSIpDQpwYXN0ZTAoc3VtbWFyeShjaGFuZ2luZyAmIGRvd25yZWd1bGF0ZWQpWzNdICwiIGdlbmVzIGRvd25yZWd1bGF0ZWQgYnkgTVBJIikNCmBgYA0KYGBge3IsIGVjaG89RkFMU0V9DQojdG8gdXNlIHRoaXMgYXMgYSByZWZlcmVuY2UgZm9yIHRoZSBnZW5lcyBzaWduYWxlZCBvdXQgZnJvbSB0aGUgdmVubiBkaWFncmFtLCBzYXZlIGFzIG9iamVjdCwNCnRvcF90YWJsZV9NUEkgPC0gdG9wX3RhYmxlDQojc2F2ZSh0b3BfdGFibGVfTVBJLCBmaWxlID0gIkQ6Ly9Bb2NlbGxhcmlzX0NQRl9NUElfVDMvU2F2ZWRfb2JqZWN0cy90b3BfdGFibGVfTVBJLnJkcyIpDQpgYGANCg0KDQpgYGB7ciwgZWNobz1GQUxTRSwgZmlnLndpZHRoPTQsIGZpZy5oZWlnaHQ9NH0NCiNhbmQgdGhlIGNvcnJlc3BvbmRpbmcgcGxvdA0KDQpnZ3Bsb3QodG9wX3RhYmxlLCBhZXMoeD1BdmVFeHByLCB5PXNpZ24oRkMpKmxvZzIoYWJzKEZDKSkpKSArIA0KICBnZW9tX3BvaW50KGRhdGE9dG9wX3RhYmxlW25laXRoZXIsXSwgc2l6ZT0wLjUsIGNvbG9yPSJncmF5NjAiLCBhbHBoYT0wLjEpICsNCiAgZ2VvbV9wb2ludChkYXRhPXRvcF90YWJsZVtub3RzaWduaWZpY2FudF9oaWdoLF0sIHNpemU9MC44LCBjb2xvcj0iZ3JheTYwIiwgYWxwaGE9MC41KSsNCiAgZ2VvbV9wb2ludChkYXRhPXRvcF90YWJsZVtzaWduaWZpY2FudF9sb3csXSwgc2l6ZT0wLjgsIGNvbG9yPSJncmF5NDAiLCBhbHBoYT0wLjUpKw0KICBnZW9tX3BvaW50KGRhdGE9dG9wX3RhYmxlW2JvdGgsXSwgc2l6ZT0xLCBjb2xvcj1pZmVsc2UodG9wX3RhYmxlW2JvdGgsICJsb2dGQyJdPjAsImxpZ2h0Y29yYWwiLCJkb2RnZXJibHVlMiIpLCBhbHBoYT0wLjUpKw0KICAgeWxpbSgtMTUsMTUpKw0KICB5bGFiKCJsb2cyKCBNUEkgLyBETVNPICkiKSsNCiAgeGxhYigiQXZlcmFnZSBFeHByZXNzaW9uIikrIA0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQ9MSwgY29sb3IgPSAibGlnaHRjb3JhbCIsIGxpbmV3aWR0aD0wLjEpKyAjIGNhbiBhZGQgbGluZXR5cGU9ImRhc2hlZCINCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0PS0xLCBjb2xvciA9ICJkb2RnZXJibHVlMiIsIGxpbmV3aWR0aD0wLjEpKw0KICBnZ3RpdGxlKCcqKkNQRioqIHZzICoqRE1TTyoqJykrDQogIGxhYnMoc3VidGl0bGUgPSAnPHNwYW4gc3R5bGUgPSAiY29sb3I6bGlnaHRjb3JhbCI+IHVwcmVndWxhdGVkPC9zcGFuPiwgDQogICAgICAgPHNwYW4gc3R5bGUgPSAiY29sb3I6ZG9kZ2VyYmx1ZTIiPmRvd25yZWd1bGF0ZWQ8L3NwYW4+JykrDQogIHRoZW1lX2J3KCkrdGhlbWUocGFuZWwuYm9yZGVyID0gZWxlbWVudF9yZWN0KGNvbG9yPSJsaWdodGNvcmFsIiwgZmlsbD1OQSwgbGluZXdpZHRoPSAyKSwNCiAgICAgICAgICAgICAgICAgICBwbG90LnRpdGxlID0gZ2d0ZXh0OjplbGVtZW50X21hcmtkb3duKCksDQogICAgICAgICAgICAgICAgICAgcGxvdC5zdWJ0aXRsZSA9IGdndGV4dDo6ZWxlbWVudF9tYXJrZG93bigpKQ0KDQpgYGANCg0KYGBge3IsIGVjaG89RkFMU0V9DQojTGV0IHVzIHBsb3QgdGhlIHRvcCAyMDAgREUgZ2VuZXMNCiNsb2FkIHRoZSBjb3VudHNfVlNUIG9iamVjdA0KbG9hZCgiRDovL0FvY2VsbGFyaXNfQ1BGX01QSV9UMy9TYXZlZF9vYmplY3RzL2NvdW50c19WU1QucmRzIikNCmBgYA0KDQpgYGB7ciwgZWNobz1GQUxTRSwgaW5jbHVkZT1GQUxTRX0NCiN0byBhZGQgdGhlIGNvcnJlbGF0aW9uIHZhbHVlcyB3aXRoIFQzIGFuZCBNUEkgY29uZGl0aW9ucywgbGV0IHVzIG1ha2UgYSB0YWJsZQ0KDQoNCiNjYWxjdWxhdGUgei1zY29yZQ0KY291bnRzX1ZTVF96IDwtIHQoc2NhbGUodChjb3VudHNfVlNUKSkpDQoNCiNjcmVhdGUgY291bnRzIHRhYmxlIHdpdGggYXZlcmFnZSB2YWx1ZXMNCmdyb3VwX2luZGVjZXMgPC0gYygwLCBjdW1zdW0odW5uYW1lKCB0YWJsZShzYW1wbGVfbWV0YWRhdGEkdHJlYXRtZW50KSkpKQ0KDQpjb3VudHNfVlNUX2F2ZXJhZ2VkIDwtIGRhdGEuZnJhbWUobWF0cml4KG5yb3c9bnJvdyhjb3VudHNfVlNUX3opLG5jb2w9MCkpDQoNCiNjYWxjdWxhdGUgdGhlIGF2ZXJhZ2UgYnkgZ3JvdXAgb2YgcmVwbGljYXRlcw0KDQpmb3IgKGkgaW4gc2VxKDE6KGxlbmd0aChncm91cF9pbmRlY2VzKS0xKSkpIHsNCiAgdG1wIDwtIGNvdW50c19WU1RfelssKGdyb3VwX2luZGVjZXNbaV0rMSk6Z3JvdXBfaW5kZWNlc1tpKzFdXQ0KICB0bXBfYXZlcmFnZXMgPC0gcm93TWVhbnModG1wKQ0KICBjb3VudHNfVlNUX2F2ZXJhZ2VkIDwtIGNiaW5kKGNvdW50c19WU1RfYXZlcmFnZWQsIHRtcF9hdmVyYWdlcykNCn0NCg0KY29sbmFtZXMoY291bnRzX1ZTVF9hdmVyYWdlZCkgPC0gdW5pcXVlKHNhbXBsZV9tZXRhZGF0YSR0cmVhdG1lbnQpDQoNCmNvcnJfZGYgPC0gYXMuZGF0YS5mcmFtZShyb3duYW1lcyhjb3VudHNfVlNUX2F2ZXJhZ2VkKSkNCm5hbWVzKGNvcnJfZGYpIDwtICJnZW5lX2lkIg0KaGVhZChjb3JyX2RmKQ0KDQpjb3JyX2RmJGRlbHRhVDMgPC0gYWJzKGNvdW50c19WU1RfYXZlcmFnZWRbLCJNUEkiXS1jb3VudHNfVlNUX2F2ZXJhZ2VkWywiVDNJT1AiXSkgDQpjb3JyX2RmJGRlbHRhQ1BGIDwtIGFicyhjb3VudHNfVlNUX2F2ZXJhZ2VkWywiTVBJIl0tY291bnRzX1ZTVF9hdmVyYWdlZFssIkNQRiJdKSANCmNvcnJfZGYkc2ltaWxhcml0eSA8LSBOQQ0KaGVhZChjb3JyX2RmKQ0KDQpmb3IgKGkgaW4gc2VxKDE6bnJvdyhjb3JyX2RmKSkpIHsNCiAgaWYgKGFicyhjb3JyX2RmJGRlbHRhVDNbaV0pPCBhYnMoY29ycl9kZiRkZWx0YUNQRltpXSkpIHsNCiAgICBjb3JyX2RmJHNpbWlsYXJpdHlbaV0gPC0gIlQzIg0KICAgIA0KICB9DQogIA0KICBlbHNlIHsNCiAgICBjb3JyX2RmJHNpbWlsYXJpdHlbaV0gPC0gIkNQRiINCiAgICANCiAgfQ0KICANCiAgI2lmIHRoZSBjbG9zZXN0IHRyZWF0bWVudCBpcyBtb3JlIHRoYW4gMXNpZ25tYSBhd2F5LCBDUEYgaXMgbm90IHNpbWlsYXIgdG8gaXQgKGFuZCBzbyBldmVuIGxlc3MgdG8gdGhlIG90aGVyIG9uZSksIGl0J3MgYSB1bmlxdWUgcmVzcG9uc2UNCiAgaWYgKG1pbihjb3JyX2RmJGRlbHRhVDNbaV0sIGNvcnJfZGYkZGVsdGFDUEZbaV0pID4xKSB7DQogICAgY29ycl9kZiRzaW1pbGFyaXR5W2ldIDwtICJuZWl0aGVyIg0KICAgIA0KICB9DQogIA0KICAjaWYgYm90aCBvdGhlciB0cmVhdG1lbnRzIGFyZSB3aXRoaW4gMSBzaWdtYSwgQ1BGIGlzIGluIGZhY3Qgc2ltaWxhciB0byBib3RoIHRyZWF0bWVudHMNCiAgaWYgKChjb3JyX2RmJGRlbHRhVDNbaV0gPDEpICYgKGNvcnJfZGYkZGVsdGFDUEZbaV0gPDEpKSB7DQogICAgY29ycl9kZiRzaW1pbGFyaXR5W2ldIDwtICJib3RoIg0KICAgIA0KICB9DQogIA0KfQ0KDQpyb3duYW1lcyhjb3JyX2RmKSA8LSBjb3JyX2RmJGdlbmVfaWQNCmNvcnJfZGYgPC0gY29ycl9kZlssMjo0XQ0KaGVhZChjb3JyX2RmKQ0KDQpyb3duYW1lcyhjb3JyX2RmKSA8LSBhbm5vdGF0aW9uX2luZm8kbWVyZ2VkX2Rlc2NyaXB0aW9uW21hdGNoKHJvd25hbWVzKGNvcnJfZGYpLCBhbm5vdGF0aW9uX2luZm8kZW50cmV6X0lEKV0NCg0KaGVhZChjb3JyX2RmKQ0KYGBgDQoNCmBgYHtyLCBlY2hvPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQ0Kc2VsZWN0ZWRfZ2VuZXMgPC0gdG9wX3RhYmxlW3RvcF90YWJsZSRlbnRyZXpfSUQgJWluJSB0b3BfdGFibGUkZW50cmV6X0lEW2JvdGggJiB1cHJlZ3VsYXRlZF0sIF1bMTphcy5udW1lcmljKHN1bW1hcnkoY2hhbmdpbmcgJiB1cHJlZ3VsYXRlZClbM10pLCJlbnRyZXpfSUQiXQ0KI3NlbGVjdGVkX2dlbmVzIDwtIHRvcF90YWJsZVt0b3BfdGFibGUkZW50cmV6X0lEICVpbiUgdG9wX3RhYmxlJGVudHJlel9JRFtib3RoICYgdXByZWd1bGF0ZWRdLCBdWzE6NTAsImVudHJlel9JRCJdDQoNCiMgUmV0dXJucyB0aGUgbWlzc2luZyBnZW5lczoNCm1pc3NpbmdfZ2VuZXMgPC0gYXMuZGF0YS5mcmFtZShzZXRkaWZmKHNlbGVjdGVkX2dlbmVzLCByb3cubmFtZXMoY291bnRzX1ZTVCkpKQ0KY29sbmFtZXMobWlzc2luZ19nZW5lcykgPC0gImVudHJlel9JRCINCm1pc3NpbmdfZ2VuZXMkZGVzY3JpcHRpb24gPC0gYW5ub3RhdGlvbl9pbmZvJG1lcmdlZF9kZXNjcmlwdGlvblttYXRjaChtaXNzaW5nX2dlbmVzJGVudHJlel9JRCxhbm5vdGF0aW9uX2luZm8kZW50cmV6X0lEKV0NCg0KDQojIFJldHVybnMgdGhlIGV4aXN0aW5nIGdlbmVzOg0Kc2VsZWN0ZWRfZ2VuZXMgPC0gYXMuZGF0YS5mcmFtZShpbnRlcnNlY3Qoc2VsZWN0ZWRfZ2VuZXMsIHJvdy5uYW1lcyhjb3VudHNfVlNUKSkpDQpjb2xuYW1lcyhzZWxlY3RlZF9nZW5lcykgPC0gImVudHJlel9JRCINCnNlbGVjdGVkX2dlbmVzJGRlc2NyaXB0aW9uIDwtIGFubm90YXRpb25faW5mbyRtZXJnZWRfZGVzY3JpcHRpb25bbWF0Y2goc2VsZWN0ZWRfZ2VuZXMkZW50cmV6X0lELGFubm90YXRpb25faW5mbyRlbnRyZXpfSUQpXQ0KDQoNCiNwcmludCBsaXN0IG9mIGRpY2FyZGVkIGdlbmVzIChiZWNhdXNlIG1pc3NpbmcpIGFuZCBvZiByZXRhaW5lZCBnZW5lcyAoY3VyYXRlZCBkaWdlc3Rpb24gZ2VuZXMsIHByZXNlbnQgaW4gdGhlIGRhdGFzZXQpDQoNCmthYmxlKG1pc3NpbmdfZ2VuZXMsIGNhcHRpb24gPSAiR2VuZXMgbWlzc2luZyBmcm9tIHRoZSBkYXRhc2V0IChpZ25vcmVkKSIpDQprYWJsZShzZWxlY3RlZF9nZW5lcywgY2FwdGlvbiA9ICJHZW5lcyByZXRhaW5lZCIpDQoNCg0KIyMgc3Vic2V0IHRoZSBvcmlnaW5hbCBWU1Qgb2JqZWN0IHRvIG9ubHkga2VlcCBzZWxlY3RlZCBnZW5lcw0KY291bnRzX1ZTVF9zZWxlY3RlZGdlbmVzIDwtIHN1YnNldChjb3VudHNfVlNULCByb3duYW1lcyhjb3VudHNfVlNUKSAlaW4lIHNlbGVjdGVkX2dlbmVzJGVudHJlel9JRCkNCg0KIyMgQ3JlYXRlIFVuaXF1ZSBDb2x1bW4gTmFtZXMNCiNyb3duYW1lcyhjb3VudHNfVlNUX3NlbGVjdGVkZ2VuZXMpIDwtIGRwbHlyOjpyZWNvZGUoDQojICByb3duYW1lcyhjb3VudHNfVlNUX3NlbGVjdGVkZ2VuZXMpLCANCiMgICEhIXNldE5hbWVzKG1ha2UudW5pcXVlKGFzLmNoYXJhY3Rlcihhbm5vdGF0aW9uX2luZm8kZGVzY3JpcHRpb24pKSwgIyBjb2x1bW4gb2YgZGljdGlvbmFyeSB0YWJsZSB0aGF0IGhhcyBORVcgbmFtZXMNCiMgICAgICAgICAgICAgIGFubm90YXRpb25faW5mbyRlbnNlbWJsX2dlbmVfaWQpICAjY29sdW1uIG9mIGRpY3Rpb25hcnkgdGFibGUgd2l0aCBPTEQgbmFtZXMNCiMgICkNCg0Kcm93bmFtZXMoY291bnRzX1ZTVF9zZWxlY3RlZGdlbmVzKSA8LSBhbm5vdGF0aW9uX2luZm8kbWVyZ2VkX2Rlc2NyaXB0aW9uW21hdGNoKHJvd25hbWVzKGNvdW50c19WU1Rfc2VsZWN0ZWRnZW5lcyksIGFubm90YXRpb25faW5mbyRlbnRyZXpfSUQpXQ0KDQoNCiNyZW1vdmUgdW51c2VkIHZhcmlhYmxlcw0KI3JtKG1pc3NpbmdfZ2VuZXMpDQpgYGANCg0KYGBge3IsIGZpZy5oZWlnaHQ9NSwgZmlnLndpZHRoPTE1LCBlY2hvPUZBTFNFfQ0KDQojI2RlZmluZSB0aGUgY29sb3JzIGZvciB0aGUgaGVhdG1hcCAoY2F0ZWdvcmljYWwpOiAxIGNvbG9yIGZvciBlYWNoIHNtYWxsZXN0IGV4cGVyaW1lbnRhbCB1bml0IHRoYXQgaXMgYmVpbmcgIGNvbXBhcmVkOyBpLmUuIGhlcmUgdGhlIHRyZWF0bWVudA0KY29sb3JfY2F0ZWdvcmljYWxfaGVhdG1hcCA8LSBjb2xvcl9jYXRlZ29yaWNhbF90cmVhdG1lbnQNCiNuYW1lIHRoaXMgbGlzdCBvZiBjb2xvciB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIG5hbWVzIChub3RlOiB0aGVzZSBhcmUgdGhlIHVuaXF1ZSB2YWx1ZXMgZm9yIHRoYXQgY2F0ZWdvcnkgaW4gdGhlIHNhbXBsZSBtZXRhZGF0YSkNCmNvbG9yX2NhdGVnb3JpY2FsX2hlYXRtYXBfbmFtZWQgPC0gY29sb3JfY2F0ZWdvcmljYWxfaGVhdG1hcA0KbmFtZXMoY29sb3JfY2F0ZWdvcmljYWxfaGVhdG1hcF9uYW1lZCkgPC0gdW5pcXVlKHNhbXBsZV9tZXRhZGF0YSR0cmVhdG1lbnQpDQoNCiNsb2FkIHRoaXMgaW5mb3JtYXRpb24gaW50byB0aGUgaGVhdG1hcA0KY29sQW5uIDwtIEhlYXRtYXBBbm5vdGF0aW9uKCNkZiA9IGRhdGEuZnJhbWUodHJlYXRtZW50ID0gc2FtcGxlX21ldGFkYXRhJHRyZWF0bWVudCksICN0aGUgbmFtZSBvZiB0aGUgY29sdW1uIG5lZWRzIHRvIG1hdGNoIHRoZSBuYW1lIG9mIHRoZSBuYW1lZCBsaXN0DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgI2NvbCA9IGxpc3QoInRyZWF0bWVudCIgPSBjb2xvcl9jYXRlZ29yaWNhbF9oZWF0bWFwX25hbWVkKSwgI3NldCB0aGUgbmFtZSBvZiB0aGUgbmFtZWQgbGlzdCBzbyBpdCBtYXRjaGVzDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgI2Fubm90YXRpb25fd2lkdGggPSB1bml0KGMoMSwgNCksICdjbScpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICNnYXAgPSB1bml0KDEsICdtbScpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd19sZWdlbmQgPSBGQUxTRSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG93X2Fubm90YXRpb25fbmFtZSA9IEZBTFNFLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoID0gJ2NvbCcsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgI2Fsc28gY3JlYXRlIGFuIGVtcHR5IHJvdyBhYm9lIHRoZSBoZWF0bWFwLCB0byBkaXNwbGF5IGFkZGl0aW9uYWwgaW5mbw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtcHR5MSA9IGFubm9fZW1wdHkoYm9yZGVyID0gRkFMU0UsIGhlaWdodD0gdW5pdCg4LCAibW0iKSkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApDQoNCg0Kc2ltaWxhcml0eV9saXN0X25hbWVkIDwtIGMoInBhbGVncmVlbjMiLCAibGlnaHRza3libHVlIiwgImdyYXk4MCIsICJ3aGl0ZSIpDQpuYW1lcyhzaW1pbGFyaXR5X2xpc3RfbmFtZWQpIDwtIGMoIlQzIiwgIkNQRiIsICJuZWl0aGVyIiwgImJvdGgiKQ0KDQpoYSA9IHJvd0Fubm90YXRpb24oZGYgPSBkYXRhLmZyYW1lKHRyZWF0bWVudCA9IGNvcnJfZGZbcm93bmFtZXMoY29ycl9kZikgJWluJSByb3duYW1lcyhjb3VudHNfVlNUX3NlbGVjdGVkZ2VuZXMpLCJzaW1pbGFyaXR5Il0pLCAjdGhlIG5hbWUgb2YgdGhlIGNvbHVtbiBuZWVkcyB0byBtYXRjaCB0aGUgbmFtZSBvZiB0aGUgbmFtZWQgbGlzdA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbCA9IGxpc3QoInRyZWF0bWVudCIgPSBzaW1pbGFyaXR5X2xpc3RfbmFtZWQpLCAjc2V0IHRoZSBuYW1lIG9mIHRoZSBuYW1lZCBsaXN0IHNvIGl0IG1hdGNoZXMNCiAgICAgICAgICAgICAgICAgICBzaW1wbGVfYW5ub19zaXplID0gdW5pdCgyLCAiY20iKSwNCiAgICAgICAgICAgICAgICAgICBlbXB0eTIgPSBhbm5vX2VtcHR5KGJvcmRlciA9IEZBTFNFLCB3aWR0aD0gdW5pdCg4LCAibW0iKSkNCiAgICAgICAgICAgICAgICAgICApDQoNCg0KSGVhdG1hcChtYXQgPSB0KHNjYWxlKHQoY291bnRzX1ZTVF9zZWxlY3RlZGdlbmVzKSkpLA0KICAgICAgICBuYW1lPSAiei1zY29yZSIsDQogICAgICAgICNjb2x1bW5fdGl0bGUgPSBndF9yZW5kZXIoDQogICAgICAgICMgICJQYXR0ZXJuIG9mIGV4cHJlc3Npb24gKGFzIDxzcGFuIHN0eWxlPSdjb2xvcjpicm93bjInPioqei1zY29yZXMqKjwvc3Bhbj4pIDxici8+IG9mIENQRi11cHJlZ3VsYXRlZCBnZW5lcyINCiAgICAgICAgIyAgKSwNCiAgICAgICAgY29sID0gcmV2KGJyZXdlci5wYWwoMTEsIlJkQnUiKSksDQogICAgICAgIG5hX2NvbCA9ICJibGFjayIsDQogICAgICAgIGNsdXN0ZXJfcm93cyA9IFQsDQogICAgICAgIHNob3dfcm93X2RlbmQgPSBULA0KICAgICAgICAjcm93X29yZGVyID0gb3JkZXJlZF9sZXZlbHMsDQogICAgICAgIGNsdXN0ZXJfY29sdW1ucyA9IEZBTFNFLA0KICAgICAgICBzaG93X2NvbHVtbl9kZW5kID0gRkFMU0UsDQogICAgICAgICNjb2x1bW5fb3JkZXIgPSBvcmRlcmVkX2xldmVscywNCiAgICAgICAgI3Jvd19zcGxpdCA9IGZhY3RvcihwYXN0ZTAoc2FtcGxlX21ldGFkYXRhJHNlZ21lbnQsIHNhbXBsZV9tZXRhZGF0YSRzdGFnZSksIGxldmVscyA9IGMoImxpdmVyUzEiLCAibGl2ZXJTNCIsICJsaXZlclM3IiwgInN0b21hY2hTMSIsICJpbnRlc3RpbmVTMSIsICJzdG9tYWNoUzQiLCAiQV9pbnRlc3RpbmVTNCIsICJQX2ludGVzdGluZVM0IiwgInN0b21hY2hTNyIsICJBX2ludGVzdGluZVM3IiwgIlBfaW50ZXN0aW5lUzciKSksDQogICAgICAgIGNvbHVtbl9zcGxpdCA9IGZhY3RvcihzYW1wbGVfbWV0YWRhdGEkdHJlYXRtZW50LCBsZXZlbHMgPSBjKCJETVNPIiwgIlQzSU9QIiwgIk1QSSIsICJDUEYiLCAiQ1BGLlQzSU9QIikpLA0KICAgICAgICAjY2x1c3Rlcl9yb3dfc2xpY2VzID0gRkFMU0UsDQogICAgICAgIGNsdXN0ZXJfY29sdW1uX3NsaWNlcyA9IEZBTFNFLA0KICAgICAgICByb3dfdGl0bGUgPSBOVUxMLA0KICAgICAgICByb3dfZ2FwID0gdW5pdCgwLjUsICJtbSIpLA0KICAgICAgICBjb2x1bW5fZ2FwID0gdW5pdChjKHJlcCgxMCwxKSwgcmVwKDIsMykpLCAibW0iKSwNCiAgICAgICAgI3dpZHRoID0gdW5pdCg4LCAiY20iKSwgDQogICAgICAgICNoZWlnaHQgPSB1bml0KDgsICJjbSIpLA0KICAgICAgICBjb2x1bW5fbmFtZXNfZ3AgPSBncmlkOjpncGFyKGZvbnRzaXplID0gOCksDQogICAgICAgIHJvd19uYW1lc19ncCA9IGdyaWQ6OmdwYXIoZm9udHNpemUgPSA4KSwNCiAgICAgICAgdG9wX2Fubm90YXRpb24gPSBjb2xBbm4sDQogICAgICAgIHJpZ2h0X2Fubm90YXRpb24gPSBoYSwNCiAgICAgICAgc2hvd19yb3dfbmFtZXMgPSBGQUxTRSwNCiAgICAgICAgc2hvd19jb2x1bW5fbmFtZXMgPSBGQUxTRSwNCiAgICAgICAgc2hvd19oZWF0bWFwX2xlZ2VuZCA9IEYsDQogICAgICAgIGJvcmRlciA9IFRSVUUsDQogICAgICAgIGNsdXN0ZXJpbmdfbWV0aG9kX3Jvd3MgPSAnd2FyZC5EMicNCiAgICAgICAgI3VzZV9yYXN0ZXIgPSBUUlVFLCByYXN0ZXJfbWFnaWNrX2ZpbHRlciA9ICJHYXVzc2lhbiINCiAgICAgICAgKQ0KDQoNCmxpYnJhcnkoR2V0b3B0TG9uZykgICMgZm9yIHRoZSBmdW5jdGlvbiBxcSgpDQpncm91cF9ibG9ja19hbm5vID0gZnVuY3Rpb24oZ3JvdXAsIGVtcHR5X2Fubm8sIGdwID0gZ3BhcigpLCANCiAgICBsYWJlbCA9IE5VTEwsIGxhYmVsX2dwID0gZ3BhcigpKSB7DQoNCiAgICBzZWVrVmlld3BvcnQocXEoImFubm90YXRpb25fQHtlbXB0eV9hbm5vfV9Ae21pbihncm91cCl9IikpDQogICAgbG9jMSA9IGRldmljZUxvYyh4ID0gdW5pdCgwLCAibnBjIiksIHkgPSB1bml0KDAsICJucGMiKSkNCiAgICBzZWVrVmlld3BvcnQocXEoImFubm90YXRpb25fQHtlbXB0eV9hbm5vfV9Ae21heChncm91cCl9IikpDQogICAgbG9jMiA9IGRldmljZUxvYyh4ID0gdW5pdCgxLCAibnBjIiksIHkgPSB1bml0KDEsICJucGMiKSkNCg0KICAgIHNlZWtWaWV3cG9ydCgiZ2xvYmFsIikNCiAgICBncmlkLnJlY3QobG9jMSR4LCBsb2MxJHksIHdpZHRoID0gbG9jMiR4IC0gbG9jMSR4LCBoZWlnaHQgPSBsb2MyJHkgLSBsb2MxJHksIA0KICAgICAgICBqdXN0ID0gYygibGVmdCIsICJib3R0b20iKSwgZ3AgPSBncCkNCiAgICBpZighaXMubnVsbChsYWJlbCkpIHsNCiAgICAgICAgZ3JpZC50ZXh0KGxhYmVsLCB4ID0gKGxvYzEkeCArIGxvYzIkeCkqMC41LCB5ID0gKGxvYzEkeSArIGxvYzIkeSkqMC41LCBncCA9IGxhYmVsX2dwKQ0KICAgIH0NCn0NCg0KZ3JvdXBfYmxvY2tfYW5ubygxOjEsICJlbXB0eTEiLCBncCA9IGdwYXIoZmlsbCA9ICJncmF5NzAiKSwgbGFiZWwgPSAiRE1TTyIpDQpncm91cF9ibG9ja19hbm5vKDI6MiwgImVtcHR5MSIsIGdwID0gZ3BhcihmaWxsID0gInBhbGVncmVlbjMiKSwgbGFiZWwgPSAiVDMrSU9QIikNCmdyb3VwX2Jsb2NrX2Fubm8oMzozLCAiZW1wdHkxIiwgZ3AgPSBncGFyKGZpbGwgPSAibGlnaHRjb3JhbCIpLCBsYWJlbCA9ICJNUEkiKQ0KZ3JvdXBfYmxvY2tfYW5ubyg0OjQsICJlbXB0eTEiLCBncCA9IGdwYXIoZmlsbCA9ICJsaWdodHNreWJsdWUiKSwgbGFiZWwgPSAiQ1BGIikNCmdyb3VwX2Jsb2NrX2Fubm8oNTo1LCAiZW1wdHkxIiwgZ3AgPSBncGFyKGZpbGwgPSAib3JjaGlkMiIpLCBsYWJlbCA9ICJDUEYrVDMrSU9QIikNCg0KDQpgYGANCg0KDQpgYGB7ciwgZWNobz1GQUxTRSwgaW5jbHVkZT1GQUxTRX0NCmxvYWQoIkQ6Ly9Bb2NlbGxhcmlzX0NQRl9NUElfVDMvU2F2ZWRfb2JqZWN0cy9jb3VudHNfVlNULnJkcyIpDQpzZWxlY3RlZF9nZW5lcyA8LSB0b3BfdGFibGVbdG9wX3RhYmxlJGVudHJlel9JRCAlaW4lIHRvcF90YWJsZSRlbnRyZXpfSURbYm90aCAmIGRvd25yZWd1bGF0ZWRdLCBdWzE6YXMubnVtZXJpYyhzdW1tYXJ5KGNoYW5naW5nICYgZG93bnJlZ3VsYXRlZClbM10pLCJlbnRyZXpfSUQiXQ0KI3NlbGVjdGVkX2dlbmVzIDwtIHRvcF90YWJsZVt0b3BfdGFibGUkZW50cmV6X0lEICVpbiUgdG9wX3RhYmxlJGVudHJlel9JRFtib3RoICYgZG93bnJlZ3VsYXRlZF0sIF1bMTo1MCwiZW50cmV6X0lEIl0NCg0KIyBSZXR1cm5zIHRoZSBtaXNzaW5nIGdlbmVzOg0KbWlzc2luZ19nZW5lcyA8LSBhcy5kYXRhLmZyYW1lKHNldGRpZmYoc2VsZWN0ZWRfZ2VuZXMsIHJvdy5uYW1lcyhjb3VudHNfVlNUKSkpDQpjb2xuYW1lcyhtaXNzaW5nX2dlbmVzKSA8LSAiZW50cmV6X0lEIg0KbWlzc2luZ19nZW5lcyRkZXNjcmlwdGlvbiA8LSBhbm5vdGF0aW9uX2luZm8kbWVyZ2VkX2Rlc2NyaXB0aW9uW21hdGNoKG1pc3NpbmdfZ2VuZXMkZW50cmV6X0lELGFubm90YXRpb25faW5mbyRlbnRyZXpfSUQpXQ0KDQoNCiMgUmV0dXJucyB0aGUgZXhpc3RpbmcgZ2VuZXM6DQpzZWxlY3RlZF9nZW5lcyA8LSBhcy5kYXRhLmZyYW1lKGludGVyc2VjdChzZWxlY3RlZF9nZW5lcywgcm93Lm5hbWVzKGNvdW50c19WU1QpKSkNCmNvbG5hbWVzKHNlbGVjdGVkX2dlbmVzKSA8LSAiZW50cmV6X0lEIg0Kc2VsZWN0ZWRfZ2VuZXMkZGVzY3JpcHRpb24gPC0gYW5ub3RhdGlvbl9pbmZvJG1lcmdlZF9kZXNjcmlwdGlvblttYXRjaChzZWxlY3RlZF9nZW5lcyRlbnRyZXpfSUQsYW5ub3RhdGlvbl9pbmZvJGVudHJlel9JRCldDQoNCg0KI3ByaW50IGxpc3Qgb2YgZGljYXJkZWQgZ2VuZXMgKGJlY2F1c2UgbWlzc2luZykgYW5kIG9mIHJldGFpbmVkIGdlbmVzIChjdXJhdGVkIGRpZ2VzdGlvbiBnZW5lcywgcHJlc2VudCBpbiB0aGUgZGF0YXNldCkNCg0Ka2FibGUobWlzc2luZ19nZW5lcywgY2FwdGlvbiA9ICJHZW5lcyBtaXNzaW5nIGZyb20gdGhlIGRhdGFzZXQgKGlnbm9yZWQpIikNCmthYmxlKHNlbGVjdGVkX2dlbmVzLCBjYXB0aW9uID0gIkdlbmVzIHJldGFpbmVkIikNCg0KDQojIyBzdWJzZXQgdGhlIG9yaWdpbmFsIFZTVCBvYmplY3QgdG8gb25seSBrZWVwIHNlbGVjdGVkIGdlbmVzDQpjb3VudHNfVlNUX3NlbGVjdGVkZ2VuZXMgPC0gc3Vic2V0KGNvdW50c19WU1QsIHJvd25hbWVzKGNvdW50c19WU1QpICVpbiUgc2VsZWN0ZWRfZ2VuZXMkZW50cmV6X0lEKQ0KDQojIyBDcmVhdGUgVW5pcXVlIENvbHVtbiBOYW1lcw0KI3Jvd25hbWVzKGNvdW50c19WU1Rfc2VsZWN0ZWRnZW5lcykgPC0gZHBseXI6OnJlY29kZSgNCiMgIHJvd25hbWVzKGNvdW50c19WU1Rfc2VsZWN0ZWRnZW5lcyksIA0KIyAgISEhc2V0TmFtZXMobWFrZS51bmlxdWUoYXMuY2hhcmFjdGVyKGFubm90YXRpb25faW5mbyRkZXNjcmlwdGlvbikpLCAjIGNvbHVtbiBvZiBkaWN0aW9uYXJ5IHRhYmxlIHRoYXQgaGFzIE5FVyBuYW1lcw0KIyAgICAgICAgICAgICAgYW5ub3RhdGlvbl9pbmZvJGVuc2VtYmxfZ2VuZV9pZCkgICNjb2x1bW4gb2YgZGljdGlvbmFyeSB0YWJsZSB3aXRoIE9MRCBuYW1lcw0KIyAgKQ0KDQpyb3duYW1lcyhjb3VudHNfVlNUX3NlbGVjdGVkZ2VuZXMpIDwtIGFubm90YXRpb25faW5mbyRtZXJnZWRfZGVzY3JpcHRpb25bbWF0Y2gocm93bmFtZXMoY291bnRzX1ZTVF9zZWxlY3RlZGdlbmVzKSwgYW5ub3RhdGlvbl9pbmZvJGVudHJlel9JRCldDQoNCg0KI3JlbW92ZSB1bnVzZWQgdmFyaWFibGVzDQojcm0obWlzc2luZ19nZW5lcykNCmBgYA0KDQpgYGB7ciwgZmlnLmhlaWdodD01LCBmaWcud2lkdGg9MTUsIGVjaG89RkFMU0V9DQoNCiMjZGVmaW5lIHRoZSBjb2xvcnMgZm9yIHRoZSBoZWF0bWFwIChjYXRlZ29yaWNhbCk6IDEgY29sb3IgZm9yIGVhY2ggc21hbGxlc3QgZXhwZXJpbWVudGFsIHVuaXQgdGhhdCBpcyBiZWluZyAgY29tcGFyZWQ7IGkuZS4gaGVyZSB0aGUgdHJlYXRtZW50DQpjb2xvcl9jYXRlZ29yaWNhbF9oZWF0bWFwIDwtIGNvbG9yX2NhdGVnb3JpY2FsX3RyZWF0bWVudA0KI25hbWUgdGhpcyBsaXN0IG9mIGNvbG9yIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgbmFtZXMgKG5vdGU6IHRoZXNlIGFyZSB0aGUgdW5pcXVlIHZhbHVlcyBmb3IgdGhhdCBjYXRlZ29yeSBpbiB0aGUgc2FtcGxlIG1ldGFkYXRhKQ0KY29sb3JfY2F0ZWdvcmljYWxfaGVhdG1hcF9uYW1lZCA8LSBjb2xvcl9jYXRlZ29yaWNhbF9oZWF0bWFwDQpuYW1lcyhjb2xvcl9jYXRlZ29yaWNhbF9oZWF0bWFwX25hbWVkKSA8LSB1bmlxdWUoc2FtcGxlX21ldGFkYXRhJHRyZWF0bWVudCkNCg0KI2xvYWQgdGhpcyBpbmZvcm1hdGlvbiBpbnRvIHRoZSBoZWF0bWFwDQpjb2xBbm4gPC0gSGVhdG1hcEFubm90YXRpb24oI2RmID0gZGF0YS5mcmFtZSh0cmVhdG1lbnQgPSBzYW1wbGVfbWV0YWRhdGEkdHJlYXRtZW50KSwgI3RoZSBuYW1lIG9mIHRoZSBjb2x1bW4gbmVlZHMgdG8gbWF0Y2ggdGhlIG5hbWUgb2YgdGhlIG5hbWVkIGxpc3QNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjY29sID0gbGlzdCgidHJlYXRtZW50IiA9IGNvbG9yX2NhdGVnb3JpY2FsX2hlYXRtYXBfbmFtZWQpLCAjc2V0IHRoZSBuYW1lIG9mIHRoZSBuYW1lZCBsaXN0IHNvIGl0IG1hdGNoZXMNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjYW5ub3RhdGlvbl93aWR0aCA9IHVuaXQoYygxLCA0KSwgJ2NtJyksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgI2dhcCA9IHVuaXQoMSwgJ21tJykNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG93X2xlZ2VuZCA9IEZBTFNFLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3dfYW5ub3RhdGlvbl9uYW1lID0gRkFMU0UsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2ggPSAnY29sJywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjYWxzbyBjcmVhdGUgYW4gZW1wdHkgcm93IGFib2UgdGhlIGhlYXRtYXAsIHRvIGRpc3BsYXkgYWRkaXRpb25hbCBpbmZvDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1wdHkxID0gYW5ub19lbXB0eShib3JkZXIgPSBGQUxTRSwgaGVpZ2h0PSB1bml0KDgsICJtbSIpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICkNCg0KDQpzaW1pbGFyaXR5X2xpc3RfbmFtZWQgPC0gYygicGFsZWdyZWVuMyIsICJsaWdodHNreWJsdWUiLCAiZ3JheTgwIiwgIndoaXRlIikNCm5hbWVzKHNpbWlsYXJpdHlfbGlzdF9uYW1lZCkgPC0gYygiVDMiLCAiQ1BGIiwgIm5laXRoZXIiLCAiYm90aCIpDQoNCmhhID0gcm93QW5ub3RhdGlvbihkZiA9IGRhdGEuZnJhbWUodHJlYXRtZW50ID0gY29ycl9kZltyb3duYW1lcyhjb3JyX2RmKSAlaW4lIHJvd25hbWVzKGNvdW50c19WU1Rfc2VsZWN0ZWRnZW5lcyksInNpbWlsYXJpdHkiXSksICN0aGUgbmFtZSBvZiB0aGUgY29sdW1uIG5lZWRzIHRvIG1hdGNoIHRoZSBuYW1lIG9mIHRoZSBuYW1lZCBsaXN0DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sID0gbGlzdCgidHJlYXRtZW50IiA9IHNpbWlsYXJpdHlfbGlzdF9uYW1lZCksICNzZXQgdGhlIG5hbWUgb2YgdGhlIG5hbWVkIGxpc3Qgc28gaXQgbWF0Y2hlcw0KICAgICAgICAgICAgICAgICAgIHNpbXBsZV9hbm5vX3NpemUgPSB1bml0KDIsICJjbSIpLA0KICAgICAgICAgICAgICAgICAgIGVtcHR5MiA9IGFubm9fZW1wdHkoYm9yZGVyID0gRkFMU0UsIHdpZHRoPSB1bml0KDgsICJtbSIpKQ0KICAgICAgICAgICAgICAgICAgICkNCg0KDQpIZWF0bWFwKG1hdCA9IHQoc2NhbGUodChjb3VudHNfVlNUX3NlbGVjdGVkZ2VuZXMpKSksDQogICAgICAgIG5hbWU9ICJ6LXNjb3JlIiwNCiAgICAgICAgI2NvbHVtbl90aXRsZSA9IGd0X3JlbmRlcigNCiAgICAgICAgIyAgIlBhdHRlcm4gb2YgZXhwcmVzc2lvbiAoYXMgPHNwYW4gc3R5bGU9J2NvbG9yOmJyb3duMic+Kip6LXNjb3JlcyoqPC9zcGFuPikgPGJyLz4gb2YgQ1BGLXVwcmVndWxhdGVkIGdlbmVzIg0KICAgICAgICAjICApLA0KICAgICAgICBjb2wgPSByZXYoYnJld2VyLnBhbCgxMSwiUmRCdSIpKSwNCiAgICAgICAgbmFfY29sID0gImJsYWNrIiwNCiAgICAgICAgY2x1c3Rlcl9yb3dzID0gVCwNCiAgICAgICAgc2hvd19yb3dfZGVuZCA9IFQsDQogICAgICAgICNyb3dfb3JkZXIgPSBvcmRlcmVkX2xldmVscywNCiAgICAgICAgY2x1c3Rlcl9jb2x1bW5zID0gRkFMU0UsDQogICAgICAgIHNob3dfY29sdW1uX2RlbmQgPSBGQUxTRSwNCiAgICAgICAgI2NvbHVtbl9vcmRlciA9IG9yZGVyZWRfbGV2ZWxzLA0KICAgICAgICAjcm93X3NwbGl0ID0gZmFjdG9yKHBhc3RlMChzYW1wbGVfbWV0YWRhdGEkc2VnbWVudCwgc2FtcGxlX21ldGFkYXRhJHN0YWdlKSwgbGV2ZWxzID0gYygibGl2ZXJTMSIsICJsaXZlclM0IiwgImxpdmVyUzciLCAic3RvbWFjaFMxIiwgImludGVzdGluZVMxIiwgInN0b21hY2hTNCIsICJBX2ludGVzdGluZVM0IiwgIlBfaW50ZXN0aW5lUzQiLCAic3RvbWFjaFM3IiwgIkFfaW50ZXN0aW5lUzciLCAiUF9pbnRlc3RpbmVTNyIpKSwNCiAgICAgICAgY29sdW1uX3NwbGl0ID0gZmFjdG9yKHNhbXBsZV9tZXRhZGF0YSR0cmVhdG1lbnQsIGxldmVscyA9IGMoIkRNU08iLCAiVDNJT1AiLCAiTVBJIiwgIkNQRiIsICJDUEYuVDNJT1AiKSksDQogICAgICAgICNjbHVzdGVyX3Jvd19zbGljZXMgPSBGQUxTRSwNCiAgICAgICAgY2x1c3Rlcl9jb2x1bW5fc2xpY2VzID0gRkFMU0UsDQogICAgICAgIHJvd190aXRsZSA9IE5VTEwsDQogICAgICAgIHJvd19nYXAgPSB1bml0KDAuNSwgIm1tIiksDQogICAgICAgIGNvbHVtbl9nYXAgPSB1bml0KGMocmVwKDEwLDEpLCByZXAoMiwzKSksICJtbSIpLA0KICAgICAgICAjd2lkdGggPSB1bml0KDgsICJjbSIpLCANCiAgICAgICAgI2hlaWdodCA9IHVuaXQoOCwgImNtIiksDQogICAgICAgIGNvbHVtbl9uYW1lc19ncCA9IGdyaWQ6OmdwYXIoZm9udHNpemUgPSA4KSwNCiAgICAgICAgcm93X25hbWVzX2dwID0gZ3JpZDo6Z3Bhcihmb250c2l6ZSA9IDgpLA0KICAgICAgICB0b3BfYW5ub3RhdGlvbiA9IGNvbEFubiwNCiAgICAgICAgcmlnaHRfYW5ub3RhdGlvbiA9IGhhLA0KICAgICAgICBzaG93X3Jvd19uYW1lcyA9IEZBTFNFLA0KICAgICAgICBzaG93X2NvbHVtbl9uYW1lcyA9IEZBTFNFLA0KICAgICAgICBzaG93X2hlYXRtYXBfbGVnZW5kID0gRiwNCiAgICAgICAgYm9yZGVyID0gVFJVRSwNCiAgICAgICAgY2x1c3RlcmluZ19tZXRob2Rfcm93cyA9ICd3YXJkLkQyJw0KICAgICAgICAjdXNlX3Jhc3RlciA9IFRSVUUsIHJhc3Rlcl9tYWdpY2tfZmlsdGVyID0gIkdhdXNzaWFuIg0KICAgICAgICApDQoNCg0KbGlicmFyeShHZXRvcHRMb25nKSAgIyBmb3IgdGhlIGZ1bmN0aW9uIHFxKCkNCmdyb3VwX2Jsb2NrX2Fubm8gPSBmdW5jdGlvbihncm91cCwgZW1wdHlfYW5ubywgZ3AgPSBncGFyKCksIA0KICAgIGxhYmVsID0gTlVMTCwgbGFiZWxfZ3AgPSBncGFyKCkpIHsNCg0KICAgIHNlZWtWaWV3cG9ydChxcSgiYW5ub3RhdGlvbl9Ae2VtcHR5X2Fubm99X0B7bWluKGdyb3VwKX0iKSkNCiAgICBsb2MxID0gZGV2aWNlTG9jKHggPSB1bml0KDAsICJucGMiKSwgeSA9IHVuaXQoMCwgIm5wYyIpKQ0KICAgIHNlZWtWaWV3cG9ydChxcSgiYW5ub3RhdGlvbl9Ae2VtcHR5X2Fubm99X0B7bWF4KGdyb3VwKX0iKSkNCiAgICBsb2MyID0gZGV2aWNlTG9jKHggPSB1bml0KDEsICJucGMiKSwgeSA9IHVuaXQoMSwgIm5wYyIpKQ0KDQogICAgc2Vla1ZpZXdwb3J0KCJnbG9iYWwiKQ0KICAgIGdyaWQucmVjdChsb2MxJHgsIGxvYzEkeSwgd2lkdGggPSBsb2MyJHggLSBsb2MxJHgsIGhlaWdodCA9IGxvYzIkeSAtIGxvYzEkeSwgDQogICAgICAgIGp1c3QgPSBjKCJsZWZ0IiwgImJvdHRvbSIpLCBncCA9IGdwKQ0KICAgIGlmKCFpcy5udWxsKGxhYmVsKSkgew0KICAgICAgICBncmlkLnRleHQobGFiZWwsIHggPSAobG9jMSR4ICsgbG9jMiR4KSowLjUsIHkgPSAobG9jMSR5ICsgbG9jMiR5KSowLjUsIGdwID0gbGFiZWxfZ3ApDQogICAgfQ0KfQ0KDQpncm91cF9ibG9ja19hbm5vKDE6MSwgImVtcHR5MSIsIGdwID0gZ3BhcihmaWxsID0gImdyYXk3MCIpLCBsYWJlbCA9ICJETVNPIikNCmdyb3VwX2Jsb2NrX2Fubm8oMjoyLCAiZW1wdHkxIiwgZ3AgPSBncGFyKGZpbGwgPSAicGFsZWdyZWVuMyIpLCBsYWJlbCA9ICJUMytJT1AiKQ0KZ3JvdXBfYmxvY2tfYW5ubygzOjMsICJlbXB0eTEiLCBncCA9IGdwYXIoZmlsbCA9ICJsaWdodGNvcmFsIiksIGxhYmVsID0gIk1QSSIpDQpncm91cF9ibG9ja19hbm5vKDQ6NCwgImVtcHR5MSIsIGdwID0gZ3BhcihmaWxsID0gImxpZ2h0c2t5Ymx1ZSIpLCBsYWJlbCA9ICJDUEYiKQ0KZ3JvdXBfYmxvY2tfYW5ubyg1OjUsICJlbXB0eTEiLCBncCA9IGdwYXIoZmlsbCA9ICJvcmNoaWQyIiksIGxhYmVsID0gIkNQRitUMytJT1AiKQ0KDQoNCmBgYA0KDQoNCiMjIyMjIGVmZmVjdCBvZiBUMyAoVDMgdnMgRE1TTykNCg0KDQpgYGB7ciwgZWNobz1GQUxTRSwgcmVzdWx0cyA9IEZBTFNFfQ0KI0xvYWQgdm9vbSBvYmplY3QgIkRHRV9vYmplY3RfZmlsdGVyZWRub3JtZWRfVm9vbWVkIiBmb3IgZGlmZmVyZW50aWFsIGV4cHJlc3Npb24gYW5hbHlzaXMsIGFuZCBhbm5vdGF0aW9uIGluZm8NCmxvYWQoIkQ6Ly9Bb2NlbGxhcmlzX0NQRl9NUElfVDMvU2F2ZWRfb2JqZWN0cy9ER0Vfb2JqZWN0X2ZpbHRlcmVkbm9ybWVkX1Zvb21lZC5yZHMiKQ0KbG9hZCgiQzovL1VzZXJzL0RvY3Rvci9EZXNrdG9wL1JOQXNlcV9hbmFseXNlcy9hbm5vdGF0aW9uX2luZm9fTkNCSUVuc2VtYmxfY3VyYXRlZC5yZHMiKSANCg0KI3JlbmFtZSB0aGUgZGF0YWZyYW1lIGFzICJhbm5vdGF0aW9uX2luZm8iDQphbm5vdGF0aW9uX2luZm8gPC0gYW5ub3RhdGlvbl9pbmZvX05DQklFbnNlbWJsDQojcmVtb3ZlIHRoZSBjb2x1bW4gd2l0aCB0aGUgb3JpZ2luYWwgZGVzY3JpcHRpb24NCiNhbm5vdGF0aW9uX2luZm8gPC0gc3Vic2V0KGFubm90YXRpb25faW5mbywgc2VsZWN0ID0gLWMob3JpZ2luYWxfZGVzY3JpcHRpb24pKQ0KDQojcmVtb3ZlIHVudXNlZCB2YXJpYWJsZXMNCnJtKGFubm90YXRpb25faW5mb19OQ0JJRW5zZW1ibCkNCg0KIy0tLS0tLS0tLS0NCg0KIyBhcHBseSBsaW5lYXIgcmVncmVzc2lvbiBtb2RlbCB3aXRoIG1lYW4tdmFyaWFuY2UgcmVsYXRpb25zaGlwIHdlaWdodHMgY2FsY3VsYXRlZCBhYm92ZQ0KIyBsbUZpdCBmaXRzIGEgbGluZWFyIG1vZGVsIHVzaW5nIHdlaWdodGVkIGxlYXN0IHNxdWFyZXMgZm9yIGVhY2ggZ2VuZToNCiNleHRyYWN0IHRoZSBsaW5lYXIgbW9kZWxzIHRoYXQgaGFkIGJlZW4gZml0IGluIHRoZSB2b29tIG9iamVjdA0KZml0X3Jlc3VsdHMgPC0gbG1GaXQoREdFX29iamVjdF9maWx0ZXJlZG5vcm1lZF9Wb29tZWQpICN0aGlzIGlzIHRoZSBzYW1lIGFzIGRvaW5nICNmaXRfcmVzdWx0cyA8LSBsbUZpdChER0Vfb2JqZWN0X2ZpbHRlcmVkbm9ybWVkX1Zvb21lZCwgd2VpZ2h0cz1ER0Vfb2JqZWN0X2ZpbHRlcmVkbm9ybWVkX1Zvb21lZFtbIndlaWdodHMiXV0pDQoNCiNzYW1lIGFzIGRvaW5nIGxtKCkgaW5kaXZpZHVhbGx5IG9uIGVhY2ggZ2VuZSAoY2FuIGFsc28gc3VwcGx5IGhlcmUgdGhlIG1vZGVsIG1hdHJpeCwgYnV0IGFscmVhZHkgaW5jb3Jwb3JhdGVkIHRocm91Z2ggdm9vbWluZykNCmhlYWQoY29lZihmaXRfcmVzdWx0cykpDQpgYGANCg0KDQpgYGB7ciBlY2hvPUZBTFNFLCBmaWcuaGVpZ2h0PTIuNSwgZmlnLndpZHRoPTksIHdhcm5pbmc9VFJVRSwgcGFnZWQucHJpbnQ9RkFMU0V9DQojQ29tcHV0ZSBjb21wYXJpc29ucyBvZiBpbnRlcmVzdA0KDQojQ29tcGFyaXNvbnMgYmV0d2VlbiBncm91cHMgKGxvZyBmb2xkLWNoYW5nZXMpIGFyZSBvYnRhaW5lZCBhcyBjb250cmFzdHMgb2YgdGhlc2UgZml0dGVkIGxpbmVhciBtb2RlbHM6DQpjb250cmFzdF9tYXRyaXggPC0gbWFrZUNvbnRyYXN0cyh0cmVhdG1lbnRUM0lPUCAgLSB0cmVhdG1lbnRETVNPICwgICMgcG9zaXRpdmUgbG9nY2hhbmdlcyB3aWxsIGJlIGhpZ2hlciBpbiBTNCwgbmVnYXRpdmUgd2lsbCBiZSBoaWdoZXIgaW4gUzENCiAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gY29sbmFtZXMoY29lZihmaXRfcmVzdWx0cykpKQ0KI3Nob3cgbmV3bHkgY3JlYXRlZCBjb250cmFzdCBtYXRyaXgNCmNvbnRyYXN0X21hdHJpeCAgIyBwb3NpdGl2ZSBsb2djaGFuZ2VzIHdpbGwgYmUgaGlnaGVyIGluIFM0LCBuZWdhdGl2ZSB3aWxsIGJlIGhpZ2hlciBpbiBTMQ0KDQojYWRkIHRoZSBjb250cmFzdCBtYXRyaXggdG8gb3VyIGZpdCBvYmplY3QNCiMgbmVlZCB0byBkbyBuZXcgb2JqZWN0cyBvciBpdCBjaGVuZ2VzICBjb2VmZmljaWVudHMgaW5zdGVhZD8NCmZpdF9yZXN1bHRzX2NvbnRyYXN0ZWQgPC0gY29udHJhc3RzLmZpdChmaXRfcmVzdWx0cywgY29udHJhc3RfbWF0cml4KQ0KDQojRW1waXJpY2FsIEJheWVzIHNtb290aGluZyBvZiBzdGFuZGFyZCBlcnJvcnMgKHNocmlua3Mgc3RhbmRhcmQgZXJyb3JzIHRoYXQgYXJlIG11Y2ggbGFyZ2VyIG9yIHNtYWxsZXIgdGhhbiB0aG9zZSBmcm9tIG90aGVyIGdlbmVzIHRvd2FyZHMgdGhlIGF2ZXJhZ2Ugc3RhbmRhcmQgZXJyb3IpIChzZWUgaHR0cHM6Ly93d3cuZGVncnV5dGVyLmNvbS9kb2kvMTAuMjIwMi8xNTQ0LTYxMTUuMTAyNykNCmZpdF9yZXN1bHRzX2NvbnRyYXN0ZWQgPC0gZUJheWVzKGZpdF9yZXN1bHRzX2NvbnRyYXN0ZWQpICN3aGVuIGFwcGxpZWQgdG8gdGhlIG91dHB1dCBvZiBsbUZpdCgpLCBwZXJmb3JtcyB0aGUgcG9vbGVkIGVzdGltYXRpb24gb2Ygc3RhbmRhcmQgZXJyb3JzIHRoYXQgcmVzdWx0cyBpbiB0aGUgbW9kZXJhdGVkIHQtc3RhdGlzdGljcyBhbmQgcmVzdWx0aW5nIHAtdmFsdWVzLg0KDQojcC5hZGp1c3QgKGJ1dCB0aGlzIHdpbGwgYmUgZG9uZSBhdXRvbWF0aWNhbGx5IGJ5IFRvcFRhYmxlIGZ1bmN0aW9uKQ0KI2luZGl2LlAudmFsdWVzPC1hcHBseSh0bXBbWyJwLnZhbHVlIl1dLCAyLCBwLmFkanVzdCwgbWV0aG9kPSJCSCIpDQojdG1wW1siQkguYWRqdXN0ZWQucHZhbHVlIl1dIDwtIGluZGl2LlAudmFsdWVzDQoNCg0KI3JlbW92ZSB1bnVzZWQgdmFyaWFibGVzDQpybShmaXRfcmVzdWx0cywgREdFX29iamVjdF9maWx0ZXJlZG5vcm1lZF9Wb29tZWQpDQpgYGANCjxici8+DQpCZWxvdywgYSBsaXN0IG9mIGFsbCB0aGUgZ2VuZXMgdGhhdCBhcHBlYXIgc2lnbmlmaWNhbnRseSBkaWZmZXJlbnRseSBleHByZXNzZWQgYmV0d2VlbiB0cmVhdG1lbnQgYW5kIGNvbnRyb2wgKGluIGVpdGhlciBkaXJlY3Rpb247IF9fVGFibGUgMV9fKS4gSW4gX19UYWJsZSAyX18sIHRoZSBzdWJlc3Qgb2Ygc2lnbmlmaWNhbnRseSBjaGFuZ2luZyBnZW5lcyB3aG9zZSBmb2xkLWNoYW5nZSBpcyBiaWdnZXIgdGhhbiAyZm9sZHMgKGluIGVpdGhlciBkaXJlY3Rpb24pLiBUaGVzZSBnZW5lcyBhcmUgcmFua2VkIGluIG9yZGVyIG9mIGRlY3JlYXNpbmcgZm9sZCBjaGFuZ2UuIDxici8+DQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KI1doYXQgZ2VuZXMgYXJlIG1vc3QgZGlmZmVyZW50aWFsbHkgZXhwcmVzc2VkPw0KZnVsbF90b3BfdGFibGUgPC0gdG9wVGFibGUoZml0X3Jlc3VsdHNfY29udHJhc3RlZCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICBzb3J0LmJ5ID0gImxvZ0ZDIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICBuID0gSW5mLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkanVzdC5tZXRob2Q9IkJIIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpbnQ9MC45NSwgI25vdGUgdGhhdCB0aGVzZSBhcmUgbm90IGFkanVzdGVkIGZvciBtdWx0aXBsZSB0ZXN0aW5nIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgI3AudmFsdWU9MC4wNQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgKQ0KDQojY3JlYXRlIGNvbHVtbiB0aGF0IHNob3dzIGxvZ0ZvbGRDaGFuZ2UgYXMgdGhlIEZvbGQgQ2hhbmdlDQpmdWxsX3RvcF90YWJsZVsiRkMiXSA8LSBzaWduKGZ1bGxfdG9wX3RhYmxlWyJsb2dGQyJdKSoyXmFicyhmdWxsX3RvcF90YWJsZVsibG9nRkMiXSkNCg0KI3NhdmUgbGlzdA0KI3NhdmUoZnVsbF90b3BfdGFibGUsIGZpbGUgPSAiRDovL0FvY2VsbGFyaXNfQ1BGX01QSV9UMy9TYXZlZF9vYmplY3RzL2Z1bGxfdG9wX3RhYmxlX1QzSU9QdnNETVNPLnJkcyIpDQojbG9hZChmaWxlID0gIkM6Ly9Vc2Vycy9Eb2N0b3IvRGVza3RvcC9STkFzZXFfYW5hbHlzZXMvQW9jZWxsYXJpc19ndXRfbWV0YW1vcnBob3Npc19saXZlci9TYXZlZF9vYmplY3RzL2Z1bGxfdG9wX3RhYmxlX1M0dnNTMS5yZHMiKQ0KYGBgDQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KI2ZpbmQgZ2VuZXMgd2l0aCBhZGp1c3RlZCBwdmFsdWUNCnNpZ25pZmljYW50IDwtIGZ1bGxfdG9wX3RhYmxlJGFkai5QLlZhbCA8IDAuMDUNCiNzdWJzZXQgZ2VuZXMgdGhhdCBhcmUgc2lnbmlmaWNhbnRseSB1cHJlZ3VsYXRlZA0KdXByZWd1bGF0ZWQgPC0gc2lnbmlmaWNhbnQgJiBzaWduKGZ1bGxfdG9wX3RhYmxlJEZDKSA9PSAxDQojc3ViZXN0IGdlbmUgdGhhdCBhcmUgc2lnbmlmaWNhbnRseSBkb3ducmVndWxhdGVkDQpkb3ducmVndWxhdGVkIDwtIHNpZ25pZmljYW50ICYgc2lnbihmdWxsX3RvcF90YWJsZSRGQykgPT0gLTENCiNmaW5kIGdlbmVzIHRoYXQgY2hhbmdlIG1vcmUgdGhhbiAyeCAobG9nMihGQyk+PTEgb3IgLTEpDQpjaGFuZ2luZyA8LSAoc2lnbihmdWxsX3RvcF90YWJsZSRGQykqbG9nMihhYnMoZnVsbF90b3BfdGFibGUkRkMpKSA+IDEgfCAoc2lnbihmdWxsX3RvcF90YWJsZSRGQykqbG9nMihhYnMoZnVsbF90b3BfdGFibGUkRkMpKSkgPCAtMSkNCg0KDQojZ2VuZXMgdGhhdCBhcmUgbmVpdGhlciBzaWduaWZpY2FudCBub3IgY2hhbmdpbmcNCm5laXRoZXIgPC0gIXNpZ25pZmljYW50ICYgIWNoYW5naW5nDQojZ2VuZXMgdGhhdCBhcmUgY2hhbmdpbmcgYnV0IG5vdCBzaWduaWZpY2FudA0Kbm90c2lnbmlmaWNhbnRfaGlnaCA8LSAhc2lnbmlmaWNhbnQgJiBjaGFuZ2luZw0KI2dlbmVzIHRoYXQgYXJlIHNpZ25pZmljYW50IGJ1dCBub3QgY2hhbmdpbmcNCnNpZ25pZmljYW50X2xvdyA8LSBzaWduaWZpY2FudCAmICFjaGFuZ2luZw0KI2ZpbmQgZ2VuZXMgdGhhdCBhcmUgYm90aCBzaWduaWZpY2FudCBhbmQgY2hhbmdpbmcNCmJvdGggPC0gc2lnbmlmaWNhbnQgJiBjaGFuZ2luZw0KDQoNCmBgYA0KDQpgYGB7ciwgZWNobz1GQUxTRX0NCiNhZGp1c3QgY29uZmlkZW5jZSBpbnRlcnZhbHMgaWYgd2UgYXJlIHRvIG9ubHkgc2VsZWN0IGEgc3Vic2V0IG9mIGdlbmVzIChpbiBvdXIgY2FzZSwgc2lnbmlmaWNhbnQgZ2VuZXMpDQojc2VlIGh0dHBzOi8vbW9uYXNoYmlvaW5mb3JtYXRpY3NwbGF0Zm9ybS5naXRodWIuaW8vci1saW5lYXItYWJhY2JzMjAxOC90b3BpY3MvbGluZWFyX21vZGVsc19hYmFjYnMyMDE4Lmh0bWwNCiNmaW5kIGdlbmVzIHdoaWNoIHdlIGNvbnNpZGVyICJzZWxlY3RlZCIgKHNpZ25pZmljYW50LCBvciBzaWduaWZpY2FudCBBTkQgbG9nMiBjaGFuZ2luZykNCg0KcHJvcF9ib3RoIDwtIG1lYW4oY2hhbmdpbmcpICMic2lnbmlmaWNhbnQgaXMgYSAwLzEgYm9vbGVhbiBzbyB0aGUgbWVhbiBpcyB0aGUgcHJvcG9ydGlvbiANCiNkb3VibGUgY2hlY2sgaGVyZSBvbiB3aHkgdXNpbmcgbWVhbihib3RoKSBnaXZlcyBub24tc2lnbmlmaWNhbnQgQ0lzIHRob3VnaCB0aGUgYWRqLnAudmFsdWUgaXMgc2lnbmlmaWNhbnQuDQpmY3JfY29uZmludCA8LSAxIC0gMC4wNSpwcm9wX2JvdGgNCiNzbyBub3cgcmVwbGFjZSB0aGUgY29uZmlkZW5jZSBpbnRlcnZhbCB2YWx1ZXMNCg0KZnVsbF90b3BfdGFibGUgPC0gdG9wVGFibGUoZml0X3Jlc3VsdHNfY29udHJhc3RlZCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICBzb3J0LmJ5ID0gImxvZ0ZDIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICBuID0gSW5mLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkanVzdC5tZXRob2Q9IkJIIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpbnQ9ZmNyX2NvbmZpbnQsICN0aGVzZSBhcmUgbm93IGFkanVzdGVkLCB3aGVuIHdlIGFyZSBqdXN0IGNvbnNpZGVyaW5nIHRoZSBzaWduaWZpY2FudCBnZW5lcw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgI3AudmFsdWU9MC4wNQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgKQ0KDQojb25seSBrZWVwIHJvdyBwYXN0IHAudmFsdWUgdGhyZXNob2xkDQojdG9wLnRhYmxlIDwtIHRvcC50YWJsZVt0b3AudGFibGUkYWRqLlAuVmFsIDw9IDAuNSwgXQ0KI2NyZWF0ZSBjb2x1bW4gdGhhdCBzaG93cyBsb2dGb2xkQ2hhbmdlIGFzIHRoZSBGb2xkIENoYW5nZQ0KZnVsbF90b3BfdGFibGVbIkZDIl0gPC0gc2lnbihmdWxsX3RvcF90YWJsZVsibG9nRkMiXSkqMl5hYnMoZnVsbF90b3BfdGFibGVbImxvZ0ZDIl0pDQoNCg0KI29ubHkga2VlcCBjb2x1bW5zIHdlIGFyZSBpbnRlcmVzdGVkIGluDQp0b3BfdGFibGUgPC0gZnVsbF90b3BfdGFibGVbYygibG9nRkMiLCAiRkMiLCAiUC5WYWx1ZSIsImFkai5QLlZhbCIsImVudHJlel9JRCIsICJtZXJnZWRfc3ltYm9sIiwibWVyZ2VkX2Rlc2NyaXB0aW9uIiwiZW5zZW1ibF9kZXNjcmlwdGlvbiIsICJBdmVFeHByIiwgIkNJLkwiLCAiQ0kuUiIsInQiKV0NCg0KI3JlbW92ZSByb3duYW1lcyAobm93IHJlZHVuZGFudCkNCnJvd25hbWVzKHRvcF90YWJsZSkgPC0gTlVMTA0KDQpmb3JtYXR0YWJsZSh0b3BfdGFibGVbdG9wX3RhYmxlJGVudHJlel9JRCAlaW4lIHRvcF90YWJsZSRlbnRyZXpfSURbYm90aCAmIHVwcmVndWxhdGVkXSwgXVsxOjIwLF0sIA0KICAgICAgICAgICAgIGNhcHRpb24gPSJUb3AyMCBnZW5lcyB1cHJlZ3VsYXRlZCBnZW5lcyAoQ1BGKTsgRkM+MiwgYWRqLnAgPDAuMDU7IHJhbmtlZCBieSBsb2dGQyIsDQogICAgICAgICAgICAjYWxpZ24gPWMoImMiLCJsIiwgImwiLCAiYyIpLCANCiAgICAgICAgICAgIGxpc3QoI2BlbnRyZXpfSURgID0gZm9ybWF0dGVyKCJzcGFuIiwgDQogICAgICAgICAgICAgICAgIyAgICAgICAgICAgICAgICAgICAgICBzdHlsZSA9IHggfiBzdHlsZSgNCiAgICAgICAgICAgICAgICAjICAgICAgICAgICAgICAgICAgICAgICAgY29sb3IgPSAiI0E5QTlBOSIsIGZvbnQud2VpZ2h0ID0gImJvbGQiKQ0KICAgICAgICAgICAgICAgICMgICAgICAgICAgICAgICAgICAgICAgKSwgDQogICAgICAgICAgICAgICAgIGBsb2dGQ2A9IGNvbG9yX3RpbGUoTkEsImRvZGdlcmJsdWUiKQ0KDQogICAgICAgICAgICAgICAgICkNCiAgICAgICAgICAgICkNCg0KDQojIGxpc3QgdG9wIGdlbmVzIGhpZ2hlciBpbiBHdXQgdHViZQ0KI2thYmxlKHRvcF90YWJsZVt0b3BfdGFibGUkZW50cmV6X0lEICVpbiUgdG9wX3RhYmxlJGVudHJlel9JRFtib3RoICYgZG93bnJlZ3VsYXRlZF0sIF1bMToyMCxdLCBjYXB0aW9uID0gIlRvcDIwIGRvd25yZWd1bGF0ZWQgZ2VuZXMgKENQRik7IEZDPDEvMiwgYWRqLnAgPDAuMDU7IHJhbmtlZCBieSBsb2dGQyIpDQoNCg0KZm9ybWF0dGFibGUodG9wX3RhYmxlW3RvcF90YWJsZSRlbnRyZXpfSUQgJWluJSB0b3BfdGFibGUkZW50cmV6X0lEW2JvdGggJiBkb3ducmVndWxhdGVkXSwgXVsxOjIwLF0sIA0KICAgICAgICAgICAgIGNhcHRpb24gPSJUb3AyMCBkb3ducmVndWxhdGVkIGdlbmVzIChDUEYpOyBGQzwxLzIsIGFkai5wIDwwLjA1OyByYW5rZWQgYnkgbG9nRkMiLA0KICAgICAgICAgICAgI2FsaWduID1jKCJjIiwibCIsICJsIiwgImMiKSwgDQogICAgICAgICAgICBsaXN0KCNgZW50cmV6X0lEYCA9IGZvcm1hdHRlcigic3BhbiIsIA0KICAgICAgICAgICAgICAgICMgICAgICAgICAgICAgICAgICAgICAgc3R5bGUgPSB4IH4gc3R5bGUoDQogICAgICAgICAgICAgICAgIyAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yID0gIiNBOUE5QTkiLCBmb250LndlaWdodCA9ICJib2xkIikNCiAgICAgICAgICAgICAgICAjICAgICAgICAgICAgICAgICAgICAgICksIA0KICAgICAgICAgICAgICAgICBgbG9nRkNgPSBjb2xvcl90aWxlKCJsaWdodGNvcmFsIiwgTkEpDQoNCiAgICAgICAgICAgICAgICAgKQ0KICAgICAgICAgICAgKQ0KDQojcmVtb3ZlIHVudXNlZCB2YXJpYWJsZXMNCnJtKHByb3BfYm90aCwgZmNyX2NvbmZpbnQgKQ0KYGBgDQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KVDNJT1BfdXByZWd1bGF0ZWQgPC0gdG9wX3RhYmxlW3RvcF90YWJsZSRlbnRyZXpfSUQgJWluJSB0b3BfdGFibGUkZW50cmV6X0lEW2JvdGggJiB1cHJlZ3VsYXRlZF0sIF1bLDVdDQpUM0lPUF9kb3ducmVndWxhdGVkPC0gdG9wX3RhYmxlW3RvcF90YWJsZSRlbnRyZXpfSUQgJWluJSB0b3BfdGFibGUkZW50cmV6X0lEW2JvdGggJiBkb3ducmVndWxhdGVkXSwgXVssNV0NCiNzYXZlKFQzSU9QX3VwcmVndWxhdGVkLCBmaWxlID0gIkQ6Ly9Bb2NlbGxhcmlzX0NQRl9NUElfVDMvU2F2ZWRfb2JqZWN0cy9UM0lPUF91cHJlZ3VsYXRlZF9nZW5lcy5yZHMiKQ0KI3NhdmUoVDNJT1BfZG93bnJlZ3VsYXRlZCwgZmlsZSA9ICJEOi8vQW9jZWxsYXJpc19DUEZfTVBJX1QzL1NhdmVkX29iamVjdHMvVDNJT1BfZG93bnJlZ3VsYXRlZF9nZW5lcy5yZHMiKQ0KYGBgDQoNCg0KYGBge3IsIGVjaG89RkFMU0V9DQojTGV0IHVzIHByaW50IGEgc3VtbWFyeSByZXByZXNlbnRhdGlvbiBvZiB0aGUgZGlmZmVyZW50aWFsbHkgZXhwcmVzc2VkIGdlbmVzDQpwYXN0ZTAoc3VtbWFyeShjaGFuZ2luZyAmIHNpZ25pZmljYW50KVszXSAsIiBkaWZmZXJlbnRpYWxseSBleHByZXNzZWQgZ2VuZXMgKFAgPDAuMDUsIEZDPDEvMiBPUiBGQz4yKToiKQ0KcGFzdGUwKHN1bW1hcnkoY2hhbmdpbmcgJiB1cHJlZ3VsYXRlZClbM10gLCIgZ2VuZXMgdXByZWd1bGF0ZWQgYnkgVDNfSU9QIikNCnBhc3RlMChzdW1tYXJ5KGNoYW5naW5nICYgZG93bnJlZ3VsYXRlZClbM10gLCIgZ2VuZXMgZG93bnJlZ3VsYXRlZCBieSBUM19JT1AiKQ0KYGBgDQoNCg0KYGBge3IsIGVjaG89RkFMU0V9DQojdG8gdXNlIHRoaXMgYXMgYSByZWZlcmVuY2UgZm9yIHRoZSBnZW5lcyBzaWduYWxlZCBvdXQgZnJvbSB0aGUgdmVubiBkaWFncmFtLCBzYXZlIGFzIG9iamVjdCwNCnRvcF90YWJsZV9UM0lPUCA8LSB0b3BfdGFibGUNCiNzYXZlKHRvcF90YWJsZV9UM0lPUCwgZmlsZSA9ICJEOi8vQW9jZWxsYXJpc19DUEZfTVBJX1QzL1NhdmVkX29iamVjdHMvdG9wX3RhYmxlX1QzSU9QLnJkcyIpDQpgYGANCg0KDQpgYGB7ciwgZWNobz1GQUxTRSwgZmlnLndpZHRoPTQsIGZpZy5oZWlnaHQ9NH0NCiNhbmQgdGhlIGNvcnJlc3BvbmRpbmcgcGxvdA0KDQpnZ3Bsb3QodG9wX3RhYmxlLCBhZXMoeD1BdmVFeHByLCB5PXNpZ24oRkMpKmxvZzIoYWJzKEZDKSkpKSArIA0KICBnZW9tX3BvaW50KGRhdGE9dG9wX3RhYmxlW25laXRoZXIsXSwgc2l6ZT0wLjUsIGNvbG9yPSJncmF5NjAiLCBhbHBoYT0wLjEpICsNCiAgZ2VvbV9wb2ludChkYXRhPXRvcF90YWJsZVtub3RzaWduaWZpY2FudF9oaWdoLF0sIHNpemU9MC44LCBjb2xvcj0iZ3JheTYwIiwgYWxwaGE9MC41KSsNCiAgZ2VvbV9wb2ludChkYXRhPXRvcF90YWJsZVtzaWduaWZpY2FudF9sb3csXSwgc2l6ZT0wLjgsIGNvbG9yPSJncmF5NDAiLCBhbHBoYT0wLjUpKw0KICBnZW9tX3BvaW50KGRhdGE9dG9wX3RhYmxlW2JvdGgsXSwgc2l6ZT0xLCBjb2xvcj1pZmVsc2UodG9wX3RhYmxlW2JvdGgsICJsb2dGQyJdPjAsImxpZ2h0Y29yYWwiLCJkb2RnZXJibHVlMiIpLCBhbHBoYT0wLjUpKw0KICAgeWxpbSgtMTAsMTApKw0KICB5bGFiKCJsb2cyKCBUMytJT1AgLyBETVNPICkiKSsNCiAgeGxhYigiQXZlcmFnZSBFeHByZXNzaW9uIikrIA0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQ9MSwgY29sb3IgPSAibGlnaHRjb3JhbCIsIGxpbmV3aWR0aD0wLjEpKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQ9LTEsIGNvbG9yID0gImRvZGdlcmJsdWUyIiwgbGluZXdpZHRoPTAuMSkrDQogIGdndGl0bGUoJyoqQ1BGKiogdnMgKipETVNPKionKSsNCiAgbGFicyhzdWJ0aXRsZSA9ICc8c3BhbiBzdHlsZSA9ICJjb2xvcjpsaWdodGNvcmFsIj4gdXByZWd1bGF0ZWQ8L3NwYW4+LCANCiAgICAgICA8c3BhbiBzdHlsZSA9ICJjb2xvcjpkb2RnZXJibHVlMiI+ZG93bnJlZ3VsYXRlZDwvc3Bhbj4nKSsNCiAgdGhlbWVfYncoKSt0aGVtZShwYW5lbC5ib3JkZXIgPSBlbGVtZW50X3JlY3QoY29sb3I9InBhbGVncmVlbjMiLCBmaWxsPU5BLCBsaW5ld2lkdGg9IDIpLA0KICAgICAgICAgICAgICAgICAgIHBsb3QudGl0bGUgPSBnZ3RleHQ6OmVsZW1lbnRfbWFya2Rvd24oKSwNCiAgICAgICAgICAgICAgICAgICBwbG90LnN1YnRpdGxlID0gZ2d0ZXh0OjplbGVtZW50X21hcmtkb3duKCkpDQoNCmBgYA0KDQpgYGB7ciwgZWNobz1GQUxTRX0NCiNMZXQgdXMgcGxvdCB0aGUgdG9wIDIwMCBERSBnZW5lcw0KI2xvYWQgdGhlIGNvdW50c19WU1Qgb2JqZWN0DQpsb2FkKCJEOi8vQW9jZWxsYXJpc19DUEZfTVBJX1QzL1NhdmVkX29iamVjdHMvY291bnRzX1ZTVC5yZHMiKQ0KYGBgDQoNCmBgYHtyLCBlY2hvPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQ0KI3RvIGFkZCB0aGUgY29ycmVsYXRpb24gdmFsdWVzIHdpdGggVDMgYW5kIE1QSSBjb25kaXRpb25zLCBsZXQgdXMgbWFrZSBhIHRhYmxlDQoNCg0KI2NhbGN1bGF0ZSB6LXNjb3JlDQpjb3VudHNfVlNUX3ogPC0gdChzY2FsZSh0KGNvdW50c19WU1QpKSkNCg0KI2NyZWF0ZSBjb3VudHMgdGFibGUgd2l0aCBhdmVyYWdlIHZhbHVlcw0KZ3JvdXBfaW5kZWNlcyA8LSBjKDAsIGN1bXN1bSh1bm5hbWUoIHRhYmxlKHNhbXBsZV9tZXRhZGF0YSR0cmVhdG1lbnQpKSkpDQoNCmNvdW50c19WU1RfYXZlcmFnZWQgPC0gZGF0YS5mcmFtZShtYXRyaXgobnJvdz1ucm93KGNvdW50c19WU1RfeiksbmNvbD0wKSkNCg0KI2NhbGN1bGF0ZSB0aGUgYXZlcmFnZSBieSBncm91cCBvZiByZXBsaWNhdGVzDQoNCmZvciAoaSBpbiBzZXEoMToobGVuZ3RoKGdyb3VwX2luZGVjZXMpLTEpKSkgew0KICB0bXAgPC0gY291bnRzX1ZTVF96WywoZ3JvdXBfaW5kZWNlc1tpXSsxKTpncm91cF9pbmRlY2VzW2krMV1dDQogIHRtcF9hdmVyYWdlcyA8LSByb3dNZWFucyh0bXApDQogIGNvdW50c19WU1RfYXZlcmFnZWQgPC0gY2JpbmQoY291bnRzX1ZTVF9hdmVyYWdlZCwgdG1wX2F2ZXJhZ2VzKQ0KfQ0KDQpjb2xuYW1lcyhjb3VudHNfVlNUX2F2ZXJhZ2VkKSA8LSB1bmlxdWUoc2FtcGxlX21ldGFkYXRhJHRyZWF0bWVudCkNCg0KY29ycl9kZiA8LSBhcy5kYXRhLmZyYW1lKHJvd25hbWVzKGNvdW50c19WU1RfYXZlcmFnZWQpKQ0KbmFtZXMoY29ycl9kZikgPC0gImdlbmVfaWQiDQpoZWFkKGNvcnJfZGYpDQoNCmNvcnJfZGYkZGVsdGFNUEkgPC0gYWJzKGNvdW50c19WU1RfYXZlcmFnZWRbLCJUM0lPUCJdLWNvdW50c19WU1RfYXZlcmFnZWRbLCJNUEkiXSkgDQpjb3JyX2RmJGRlbHRhQ1BGIDwtIGFicyhjb3VudHNfVlNUX2F2ZXJhZ2VkWywiVDNJT1AiXS1jb3VudHNfVlNUX2F2ZXJhZ2VkWywiQ1BGIl0pIA0KY29ycl9kZiRzaW1pbGFyaXR5IDwtIE5BDQpoZWFkKGNvcnJfZGYpDQoNCmZvciAoaSBpbiBzZXEoMTpucm93KGNvcnJfZGYpKSkgew0KICBpZiAoYWJzKGNvcnJfZGYkZGVsdGFNUElbaV0pPCBhYnMoY29ycl9kZiRkZWx0YUNQRltpXSkpIHsNCiAgICBjb3JyX2RmJHNpbWlsYXJpdHlbaV0gPC0gIk1QSSINCiAgICANCiAgfQ0KICANCiAgZWxzZSB7DQogICAgY29ycl9kZiRzaW1pbGFyaXR5W2ldIDwtICJDUEYiDQogICAgDQogIH0NCiAgDQogICNpZiB0aGUgY2xvc2VzdCB0cmVhdG1lbnQgaXMgbW9yZSB0aGFuIDFzaWdubWEgYXdheSwgQ1BGIGlzIG5vdCBzaW1pbGFyIHRvIGl0IChhbmQgc28gZXZlbiBsZXNzIHRvIHRoZSBvdGhlciBvbmUpLCBpdCdzIGEgdW5pcXVlIHJlc3BvbnNlDQogIGlmIChtaW4oY29ycl9kZiRkZWx0YU1QSVtpXSwgY29ycl9kZiRkZWx0YUNQRltpXSkgPjEpIHsNCiAgICBjb3JyX2RmJHNpbWlsYXJpdHlbaV0gPC0gIm5laXRoZXIiDQogICAgDQogIH0NCiAgDQogICNpZiBib3RoIG90aGVyIHRyZWF0bWVudHMgYXJlIHdpdGhpbiAxIHNpZ21hLCBDUEYgaXMgaW4gZmFjdCBzaW1pbGFyIHRvIGJvdGggdHJlYXRtZW50cw0KICBpZiAoKGNvcnJfZGYkZGVsdGFNUElbaV0gPDEpICYgKGNvcnJfZGYkZGVsdGFDUEZbaV0gPDEpKSB7DQogICAgY29ycl9kZiRzaW1pbGFyaXR5W2ldIDwtICJib3RoIg0KICAgIA0KICB9DQogIA0KfQ0KDQpyb3duYW1lcyhjb3JyX2RmKSA8LSBjb3JyX2RmJGdlbmVfaWQNCmNvcnJfZGYgPC0gY29ycl9kZlssMjo0XQ0KaGVhZChjb3JyX2RmKQ0KDQpyb3duYW1lcyhjb3JyX2RmKSA8LSBhbm5vdGF0aW9uX2luZm8kbWVyZ2VkX2Rlc2NyaXB0aW9uW21hdGNoKHJvd25hbWVzKGNvcnJfZGYpLCBhbm5vdGF0aW9uX2luZm8kZW50cmV6X0lEKV0NCg0KaGVhZChjb3JyX2RmKQ0KYGBgDQoNCmBgYHtyLCBlY2hvPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQ0Kc2VsZWN0ZWRfZ2VuZXMgPC0gdG9wX3RhYmxlW3RvcF90YWJsZSRlbnRyZXpfSUQgJWluJSB0b3BfdGFibGUkZW50cmV6X0lEW2JvdGggJiB1cHJlZ3VsYXRlZF0sIF1bMTphcy5udW1lcmljKHN1bW1hcnkoY2hhbmdpbmcgJiB1cHJlZ3VsYXRlZClbM10pLCJlbnRyZXpfSUQiXQ0KDQoNCiMgUmV0dXJucyB0aGUgbWlzc2luZyBnZW5lczoNCm1pc3NpbmdfZ2VuZXMgPC0gYXMuZGF0YS5mcmFtZShzZXRkaWZmKHNlbGVjdGVkX2dlbmVzLCByb3cubmFtZXMoY291bnRzX1ZTVCkpKQ0KY29sbmFtZXMobWlzc2luZ19nZW5lcykgPC0gImVudHJlel9JRCINCm1pc3NpbmdfZ2VuZXMkZGVzY3JpcHRpb24gPC0gYW5ub3RhdGlvbl9pbmZvJG1lcmdlZF9kZXNjcmlwdGlvblttYXRjaChtaXNzaW5nX2dlbmVzJGVudHJlel9JRCxhbm5vdGF0aW9uX2luZm8kZW50cmV6X0lEKV0NCg0KDQojIFJldHVybnMgdGhlIGV4aXN0aW5nIGdlbmVzOg0Kc2VsZWN0ZWRfZ2VuZXMgPC0gYXMuZGF0YS5mcmFtZShpbnRlcnNlY3Qoc2VsZWN0ZWRfZ2VuZXMsIHJvdy5uYW1lcyhjb3VudHNfVlNUKSkpDQpjb2xuYW1lcyhzZWxlY3RlZF9nZW5lcykgPC0gImVudHJlel9JRCINCnNlbGVjdGVkX2dlbmVzJGRlc2NyaXB0aW9uIDwtIGFubm90YXRpb25faW5mbyRtZXJnZWRfZGVzY3JpcHRpb25bbWF0Y2goc2VsZWN0ZWRfZ2VuZXMkZW50cmV6X0lELGFubm90YXRpb25faW5mbyRlbnRyZXpfSUQpXQ0KDQoNCiNwcmludCBsaXN0IG9mIGRpY2FyZGVkIGdlbmVzIChiZWNhdXNlIG1pc3NpbmcpIGFuZCBvZiByZXRhaW5lZCBnZW5lcyAoY3VyYXRlZCBkaWdlc3Rpb24gZ2VuZXMsIHByZXNlbnQgaW4gdGhlIGRhdGFzZXQpDQoNCmthYmxlKG1pc3NpbmdfZ2VuZXMsIGNhcHRpb24gPSAiR2VuZXMgbWlzc2luZyBmcm9tIHRoZSBkYXRhc2V0IChpZ25vcmVkKSIpDQprYWJsZShzZWxlY3RlZF9nZW5lcywgY2FwdGlvbiA9ICJHZW5lcyByZXRhaW5lZCIpDQoNCg0KIyMgc3Vic2V0IHRoZSBvcmlnaW5hbCBWU1Qgb2JqZWN0IHRvIG9ubHkga2VlcCBzZWxlY3RlZCBnZW5lcw0KY291bnRzX1ZTVF9zZWxlY3RlZGdlbmVzIDwtIHN1YnNldChjb3VudHNfVlNULCByb3duYW1lcyhjb3VudHNfVlNUKSAlaW4lIHNlbGVjdGVkX2dlbmVzJGVudHJlel9JRCkNCg0KIyMgQ3JlYXRlIFVuaXF1ZSBDb2x1bW4gTmFtZXMNCiNyb3duYW1lcyhjb3VudHNfVlNUX3NlbGVjdGVkZ2VuZXMpIDwtIGRwbHlyOjpyZWNvZGUoDQojICByb3duYW1lcyhjb3VudHNfVlNUX3NlbGVjdGVkZ2VuZXMpLCANCiMgICEhIXNldE5hbWVzKG1ha2UudW5pcXVlKGFzLmNoYXJhY3Rlcihhbm5vdGF0aW9uX2luZm8kZGVzY3JpcHRpb24pKSwgIyBjb2x1bW4gb2YgZGljdGlvbmFyeSB0YWJsZSB0aGF0IGhhcyBORVcgbmFtZXMNCiMgICAgICAgICAgICAgIGFubm90YXRpb25faW5mbyRlbnNlbWJsX2dlbmVfaWQpICAjY29sdW1uIG9mIGRpY3Rpb25hcnkgdGFibGUgd2l0aCBPTEQgbmFtZXMNCiMgICkNCg0Kcm93bmFtZXMoY291bnRzX1ZTVF9zZWxlY3RlZGdlbmVzKSA8LSBhbm5vdGF0aW9uX2luZm8kbWVyZ2VkX2Rlc2NyaXB0aW9uW21hdGNoKHJvd25hbWVzKGNvdW50c19WU1Rfc2VsZWN0ZWRnZW5lcyksIGFubm90YXRpb25faW5mbyRlbnRyZXpfSUQpXQ0KDQoNCiNyZW1vdmUgdW51c2VkIHZhcmlhYmxlcw0KI3JtKG1pc3NpbmdfZ2VuZXMpDQpgYGANCg0KYGBge3IsIGZpZy5oZWlnaHQ9NSwgZmlnLndpZHRoPTE1LCBlY2hvPUZBTFNFfQ0KDQojI2RlZmluZSB0aGUgY29sb3JzIGZvciB0aGUgaGVhdG1hcCAoY2F0ZWdvcmljYWwpOiAxIGNvbG9yIGZvciBlYWNoIHNtYWxsZXN0IGV4cGVyaW1lbnRhbCB1bml0IHRoYXQgaXMgYmVpbmcgIGNvbXBhcmVkOyBpLmUuIGhlcmUgdGhlIHRyZWF0bWVudA0KY29sb3JfY2F0ZWdvcmljYWxfaGVhdG1hcCA8LSBjb2xvcl9jYXRlZ29yaWNhbF90cmVhdG1lbnQNCiNuYW1lIHRoaXMgbGlzdCBvZiBjb2xvciB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIG5hbWVzIChub3RlOiB0aGVzZSBhcmUgdGhlIHVuaXF1ZSB2YWx1ZXMgZm9yIHRoYXQgY2F0ZWdvcnkgaW4gdGhlIHNhbXBsZSBtZXRhZGF0YSkNCmNvbG9yX2NhdGVnb3JpY2FsX2hlYXRtYXBfbmFtZWQgPC0gY29sb3JfY2F0ZWdvcmljYWxfaGVhdG1hcA0KbmFtZXMoY29sb3JfY2F0ZWdvcmljYWxfaGVhdG1hcF9uYW1lZCkgPC0gdW5pcXVlKHNhbXBsZV9tZXRhZGF0YSR0cmVhdG1lbnQpDQoNCiNsb2FkIHRoaXMgaW5mb3JtYXRpb24gaW50byB0aGUgaGVhdG1hcA0KY29sQW5uIDwtIEhlYXRtYXBBbm5vdGF0aW9uKCNkZiA9IGRhdGEuZnJhbWUodHJlYXRtZW50ID0gc2FtcGxlX21ldGFkYXRhJHRyZWF0bWVudCksICN0aGUgbmFtZSBvZiB0aGUgY29sdW1uIG5lZWRzIHRvIG1hdGNoIHRoZSBuYW1lIG9mIHRoZSBuYW1lZCBsaXN0DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgI2NvbCA9IGxpc3QoInRyZWF0bWVudCIgPSBjb2xvcl9jYXRlZ29yaWNhbF9oZWF0bWFwX25hbWVkKSwgI3NldCB0aGUgbmFtZSBvZiB0aGUgbmFtZWQgbGlzdCBzbyBpdCBtYXRjaGVzDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgI2Fubm90YXRpb25fd2lkdGggPSB1bml0KGMoMSwgNCksICdjbScpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICNnYXAgPSB1bml0KDEsICdtbScpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd19sZWdlbmQgPSBGQUxTRSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG93X2Fubm90YXRpb25fbmFtZSA9IEZBTFNFLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoID0gJ2NvbCcsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgI2Fsc28gY3JlYXRlIGFuIGVtcHR5IHJvdyBhYm9lIHRoZSBoZWF0bWFwLCB0byBkaXNwbGF5IGFkZGl0aW9uYWwgaW5mbw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtcHR5MSA9IGFubm9fZW1wdHkoYm9yZGVyID0gRkFMU0UsIGhlaWdodD0gdW5pdCg4LCAibW0iKSkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApDQoNCg0Kc2ltaWxhcml0eV9saXN0X25hbWVkIDwtIGMoImxpZ2h0Y29yYWwiLCAibGlnaHRza3libHVlIiwgImdyYXk4MCIsICJ3aGl0ZSIpDQpuYW1lcyhzaW1pbGFyaXR5X2xpc3RfbmFtZWQpIDwtIGMoIk1QSSIsICJDUEYiLCAibmVpdGhlciIsICJib3RoIikNCg0KaGEgPSByb3dBbm5vdGF0aW9uKGRmID0gZGF0YS5mcmFtZSh0cmVhdG1lbnQgPSBjb3JyX2RmW3Jvd25hbWVzKGNvcnJfZGYpICVpbiUgcm93bmFtZXMoY291bnRzX1ZTVF9zZWxlY3RlZGdlbmVzKSwic2ltaWxhcml0eSJdKSwgI3RoZSBuYW1lIG9mIHRoZSBjb2x1bW4gbmVlZHMgdG8gbWF0Y2ggdGhlIG5hbWUgb2YgdGhlIG5hbWVkIGxpc3QNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2wgPSBsaXN0KCJ0cmVhdG1lbnQiID0gc2ltaWxhcml0eV9saXN0X25hbWVkKSwgI3NldCB0aGUgbmFtZSBvZiB0aGUgbmFtZWQgbGlzdCBzbyBpdCBtYXRjaGVzDQogICAgICAgICAgICAgICAgICAgc2ltcGxlX2Fubm9fc2l6ZSA9IHVuaXQoMiwgImNtIiksDQogICAgICAgICAgICAgICAgICAgZW1wdHkyID0gYW5ub19lbXB0eShib3JkZXIgPSBGQUxTRSwgd2lkdGg9IHVuaXQoOCwgIm1tIikpDQogICAgICAgICAgICAgICAgICAgKQ0KDQoNCkhlYXRtYXAobWF0ID0gdChzY2FsZSh0KGNvdW50c19WU1Rfc2VsZWN0ZWRnZW5lcykpKSwNCiAgICAgICAgbmFtZT0gInotc2NvcmUiLA0KICAgICAgICAjY29sdW1uX3RpdGxlID0gZ3RfcmVuZGVyKA0KICAgICAgICAjICAiUGF0dGVybiBvZiBleHByZXNzaW9uIChhcyA8c3BhbiBzdHlsZT0nY29sb3I6YnJvd24yJz4qKnotc2NvcmVzKio8L3NwYW4+KSA8YnIvPiBvZiBDUEYtdXByZWd1bGF0ZWQgZ2VuZXMiDQogICAgICAgICMgICksDQogICAgICAgIGNvbCA9IHJldihicmV3ZXIucGFsKDExLCJSZEJ1IikpLA0KICAgICAgICBuYV9jb2wgPSAiYmxhY2siLA0KICAgICAgICBjbHVzdGVyX3Jvd3MgPSBULA0KICAgICAgICBzaG93X3Jvd19kZW5kID0gVCwNCiAgICAgICAgI3Jvd19vcmRlciA9IG9yZGVyZWRfbGV2ZWxzLA0KICAgICAgICBjbHVzdGVyX2NvbHVtbnMgPSBGQUxTRSwNCiAgICAgICAgc2hvd19jb2x1bW5fZGVuZCA9IEZBTFNFLA0KICAgICAgICAjY29sdW1uX29yZGVyID0gb3JkZXJlZF9sZXZlbHMsDQogICAgICAgICNyb3dfc3BsaXQgPSBmYWN0b3IocGFzdGUwKHNhbXBsZV9tZXRhZGF0YSRzZWdtZW50LCBzYW1wbGVfbWV0YWRhdGEkc3RhZ2UpLCBsZXZlbHMgPSBjKCJsaXZlclMxIiwgImxpdmVyUzQiLCAibGl2ZXJTNyIsICJzdG9tYWNoUzEiLCAiaW50ZXN0aW5lUzEiLCAic3RvbWFjaFM0IiwgIkFfaW50ZXN0aW5lUzQiLCAiUF9pbnRlc3RpbmVTNCIsICJzdG9tYWNoUzciLCAiQV9pbnRlc3RpbmVTNyIsICJQX2ludGVzdGluZVM3IikpLA0KICAgICAgICBjb2x1bW5fc3BsaXQgPSBmYWN0b3Ioc2FtcGxlX21ldGFkYXRhJHRyZWF0bWVudCwgbGV2ZWxzID0gYygiRE1TTyIsICJUM0lPUCIsICJNUEkiLCAiQ1BGIiwgIkNQRi5UM0lPUCIpKSwNCiAgICAgICAgI2NsdXN0ZXJfcm93X3NsaWNlcyA9IEZBTFNFLA0KICAgICAgICBjbHVzdGVyX2NvbHVtbl9zbGljZXMgPSBGQUxTRSwNCiAgICAgICAgcm93X3RpdGxlID0gTlVMTCwNCiAgICAgICAgcm93X2dhcCA9IHVuaXQoMC41LCAibW0iKSwNCiAgICAgICAgY29sdW1uX2dhcCA9IHVuaXQoYyhyZXAoMTAsMSksIHJlcCgyLDMpKSwgIm1tIiksDQogICAgICAgICN3aWR0aCA9IHVuaXQoOCwgImNtIiksIA0KICAgICAgICAjaGVpZ2h0ID0gdW5pdCg4LCAiY20iKSwNCiAgICAgICAgY29sdW1uX25hbWVzX2dwID0gZ3JpZDo6Z3Bhcihmb250c2l6ZSA9IDgpLA0KICAgICAgICByb3dfbmFtZXNfZ3AgPSBncmlkOjpncGFyKGZvbnRzaXplID0gOCksDQogICAgICAgIHRvcF9hbm5vdGF0aW9uID0gY29sQW5uLA0KICAgICAgICByaWdodF9hbm5vdGF0aW9uID0gaGEsDQogICAgICAgIHNob3dfcm93X25hbWVzID0gRkFMU0UsDQogICAgICAgIHNob3dfY29sdW1uX25hbWVzID0gRkFMU0UsDQogICAgICAgIHNob3dfaGVhdG1hcF9sZWdlbmQgPSBGLA0KICAgICAgICBib3JkZXIgPSBUUlVFLA0KICAgICAgICBjbHVzdGVyaW5nX21ldGhvZF9yb3dzID0gJ3dhcmQuRDInDQogICAgICAgICN1c2VfcmFzdGVyID0gVFJVRSwgcmFzdGVyX21hZ2lja19maWx0ZXIgPSAiR2F1c3NpYW4iDQogICAgICAgICkNCg0KDQpsaWJyYXJ5KEdldG9wdExvbmcpICAjIGZvciB0aGUgZnVuY3Rpb24gcXEoKQ0KZ3JvdXBfYmxvY2tfYW5ubyA9IGZ1bmN0aW9uKGdyb3VwLCBlbXB0eV9hbm5vLCBncCA9IGdwYXIoKSwgDQogICAgbGFiZWwgPSBOVUxMLCBsYWJlbF9ncCA9IGdwYXIoKSkgew0KDQogICAgc2Vla1ZpZXdwb3J0KHFxKCJhbm5vdGF0aW9uX0B7ZW1wdHlfYW5ub31fQHttaW4oZ3JvdXApfSIpKQ0KICAgIGxvYzEgPSBkZXZpY2VMb2MoeCA9IHVuaXQoMCwgIm5wYyIpLCB5ID0gdW5pdCgwLCAibnBjIikpDQogICAgc2Vla1ZpZXdwb3J0KHFxKCJhbm5vdGF0aW9uX0B7ZW1wdHlfYW5ub31fQHttYXgoZ3JvdXApfSIpKQ0KICAgIGxvYzIgPSBkZXZpY2VMb2MoeCA9IHVuaXQoMSwgIm5wYyIpLCB5ID0gdW5pdCgxLCAibnBjIikpDQoNCiAgICBzZWVrVmlld3BvcnQoImdsb2JhbCIpDQogICAgZ3JpZC5yZWN0KGxvYzEkeCwgbG9jMSR5LCB3aWR0aCA9IGxvYzIkeCAtIGxvYzEkeCwgaGVpZ2h0ID0gbG9jMiR5IC0gbG9jMSR5LCANCiAgICAgICAganVzdCA9IGMoImxlZnQiLCAiYm90dG9tIiksIGdwID0gZ3ApDQogICAgaWYoIWlzLm51bGwobGFiZWwpKSB7DQogICAgICAgIGdyaWQudGV4dChsYWJlbCwgeCA9IChsb2MxJHggKyBsb2MyJHgpKjAuNSwgeSA9IChsb2MxJHkgKyBsb2MyJHkpKjAuNSwgZ3AgPSBsYWJlbF9ncCkNCiAgICB9DQp9DQoNCmdyb3VwX2Jsb2NrX2Fubm8oMToxLCAiZW1wdHkxIiwgZ3AgPSBncGFyKGZpbGwgPSAiZ3JheTcwIiksIGxhYmVsID0gIkRNU08iKQ0KZ3JvdXBfYmxvY2tfYW5ubygyOjIsICJlbXB0eTEiLCBncCA9IGdwYXIoZmlsbCA9ICJwYWxlZ3JlZW4zIiksIGxhYmVsID0gIlQzK0lPUCIpDQpncm91cF9ibG9ja19hbm5vKDM6MywgImVtcHR5MSIsIGdwID0gZ3BhcihmaWxsID0gImxpZ2h0Y29yYWwiKSwgbGFiZWwgPSAiTVBJIikNCmdyb3VwX2Jsb2NrX2Fubm8oNDo0LCAiZW1wdHkxIiwgZ3AgPSBncGFyKGZpbGwgPSAibGlnaHRza3libHVlIiksIGxhYmVsID0gIkNQRiIpDQpncm91cF9ibG9ja19hbm5vKDU6NSwgImVtcHR5MSIsIGdwID0gZ3BhcihmaWxsID0gIm9yY2hpZDIiKSwgbGFiZWwgPSAiQ1BGK1QzK0lPUCIpDQoNCg0KYGBgDQoNCg0KYGBge3IsIGVjaG89RkFMU0UsIGluY2x1ZGU9RkFMU0V9DQpsb2FkKCJEOi8vQW9jZWxsYXJpc19DUEZfTVBJX1QzL1NhdmVkX29iamVjdHMvY291bnRzX1ZTVC5yZHMiKQ0Kc2VsZWN0ZWRfZ2VuZXMgPC0gdG9wX3RhYmxlW3RvcF90YWJsZSRlbnRyZXpfSUQgJWluJSB0b3BfdGFibGUkZW50cmV6X0lEW2JvdGggJiBkb3ducmVndWxhdGVkXSwgXVsxOmFzLm51bWVyaWMoc3VtbWFyeShjaGFuZ2luZyAmIGRvd25yZWd1bGF0ZWQpWzNdKSwiZW50cmV6X0lEIl0NCg0KDQojIFJldHVybnMgdGhlIG1pc3NpbmcgZ2VuZXM6DQptaXNzaW5nX2dlbmVzIDwtIGFzLmRhdGEuZnJhbWUoc2V0ZGlmZihzZWxlY3RlZF9nZW5lcywgcm93Lm5hbWVzKGNvdW50c19WU1QpKSkNCmNvbG5hbWVzKG1pc3NpbmdfZ2VuZXMpIDwtICJlbnRyZXpfSUQiDQptaXNzaW5nX2dlbmVzJGRlc2NyaXB0aW9uIDwtIGFubm90YXRpb25faW5mbyRtZXJnZWRfZGVzY3JpcHRpb25bbWF0Y2gobWlzc2luZ19nZW5lcyRlbnRyZXpfSUQsYW5ub3RhdGlvbl9pbmZvJGVudHJlel9JRCldDQoNCg0KIyBSZXR1cm5zIHRoZSBleGlzdGluZyBnZW5lczoNCnNlbGVjdGVkX2dlbmVzIDwtIGFzLmRhdGEuZnJhbWUoaW50ZXJzZWN0KHNlbGVjdGVkX2dlbmVzLCByb3cubmFtZXMoY291bnRzX1ZTVCkpKQ0KY29sbmFtZXMoc2VsZWN0ZWRfZ2VuZXMpIDwtICJlbnRyZXpfSUQiDQpzZWxlY3RlZF9nZW5lcyRkZXNjcmlwdGlvbiA8LSBhbm5vdGF0aW9uX2luZm8kbWVyZ2VkX2Rlc2NyaXB0aW9uW21hdGNoKHNlbGVjdGVkX2dlbmVzJGVudHJlel9JRCxhbm5vdGF0aW9uX2luZm8kZW50cmV6X0lEKV0NCg0KDQojcHJpbnQgbGlzdCBvZiBkaWNhcmRlZCBnZW5lcyAoYmVjYXVzZSBtaXNzaW5nKSBhbmQgb2YgcmV0YWluZWQgZ2VuZXMgKGN1cmF0ZWQgZGlnZXN0aW9uIGdlbmVzLCBwcmVzZW50IGluIHRoZSBkYXRhc2V0KQ0KDQprYWJsZShtaXNzaW5nX2dlbmVzLCBjYXB0aW9uID0gIkdlbmVzIG1pc3NpbmcgZnJvbSB0aGUgZGF0YXNldCAoaWdub3JlZCkiKQ0Ka2FibGUoc2VsZWN0ZWRfZ2VuZXMsIGNhcHRpb24gPSAiR2VuZXMgcmV0YWluZWQiKQ0KDQoNCiMjIHN1YnNldCB0aGUgb3JpZ2luYWwgVlNUIG9iamVjdCB0byBvbmx5IGtlZXAgc2VsZWN0ZWQgZ2VuZXMNCmNvdW50c19WU1Rfc2VsZWN0ZWRnZW5lcyA8LSBzdWJzZXQoY291bnRzX1ZTVCwgcm93bmFtZXMoY291bnRzX1ZTVCkgJWluJSBzZWxlY3RlZF9nZW5lcyRlbnRyZXpfSUQpDQoNCiMjIENyZWF0ZSBVbmlxdWUgQ29sdW1uIE5hbWVzDQojcm93bmFtZXMoY291bnRzX1ZTVF9zZWxlY3RlZGdlbmVzKSA8LSBkcGx5cjo6cmVjb2RlKA0KIyAgcm93bmFtZXMoY291bnRzX1ZTVF9zZWxlY3RlZGdlbmVzKSwgDQojICAhISFzZXROYW1lcyhtYWtlLnVuaXF1ZShhcy5jaGFyYWN0ZXIoYW5ub3RhdGlvbl9pbmZvJGRlc2NyaXB0aW9uKSksICMgY29sdW1uIG9mIGRpY3Rpb25hcnkgdGFibGUgdGhhdCBoYXMgTkVXIG5hbWVzDQojICAgICAgICAgICAgICBhbm5vdGF0aW9uX2luZm8kZW5zZW1ibF9nZW5lX2lkKSAgI2NvbHVtbiBvZiBkaWN0aW9uYXJ5IHRhYmxlIHdpdGggT0xEIG5hbWVzDQojICApDQoNCnJvd25hbWVzKGNvdW50c19WU1Rfc2VsZWN0ZWRnZW5lcykgPC0gYW5ub3RhdGlvbl9pbmZvJG1lcmdlZF9kZXNjcmlwdGlvblttYXRjaChyb3duYW1lcyhjb3VudHNfVlNUX3NlbGVjdGVkZ2VuZXMpLCBhbm5vdGF0aW9uX2luZm8kZW50cmV6X0lEKV0NCg0KDQojcmVtb3ZlIHVudXNlZCB2YXJpYWJsZXMNCiNybShtaXNzaW5nX2dlbmVzKQ0KYGBgDQoNCmBgYHtyLCBmaWcuaGVpZ2h0PTUsIGZpZy53aWR0aD0xNSwgZWNobz1GQUxTRX0NCg0KIyNkZWZpbmUgdGhlIGNvbG9ycyBmb3IgdGhlIGhlYXRtYXAgKGNhdGVnb3JpY2FsKTogMSBjb2xvciBmb3IgZWFjaCBzbWFsbGVzdCBleHBlcmltZW50YWwgdW5pdCB0aGF0IGlzIGJlaW5nICBjb21wYXJlZDsgaS5lLiBoZXJlIHRoZSB0cmVhdG1lbnQNCmNvbG9yX2NhdGVnb3JpY2FsX2hlYXRtYXAgPC0gY29sb3JfY2F0ZWdvcmljYWxfdHJlYXRtZW50DQojbmFtZSB0aGlzIGxpc3Qgb2YgY29sb3Igd2l0aCB0aGUgY29ycmVzcG9uZGluZyBuYW1lcyAobm90ZTogdGhlc2UgYXJlIHRoZSB1bmlxdWUgdmFsdWVzIGZvciB0aGF0IGNhdGVnb3J5IGluIHRoZSBzYW1wbGUgbWV0YWRhdGEpDQpjb2xvcl9jYXRlZ29yaWNhbF9oZWF0bWFwX25hbWVkIDwtIGNvbG9yX2NhdGVnb3JpY2FsX2hlYXRtYXANCm5hbWVzKGNvbG9yX2NhdGVnb3JpY2FsX2hlYXRtYXBfbmFtZWQpIDwtIHVuaXF1ZShzYW1wbGVfbWV0YWRhdGEkdHJlYXRtZW50KQ0KDQojbG9hZCB0aGlzIGluZm9ybWF0aW9uIGludG8gdGhlIGhlYXRtYXANCmNvbEFubiA8LSBIZWF0bWFwQW5ub3RhdGlvbigjZGYgPSBkYXRhLmZyYW1lKHRyZWF0bWVudCA9IHNhbXBsZV9tZXRhZGF0YSR0cmVhdG1lbnQpLCAjdGhlIG5hbWUgb2YgdGhlIGNvbHVtbiBuZWVkcyB0byBtYXRjaCB0aGUgbmFtZSBvZiB0aGUgbmFtZWQgbGlzdA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICNjb2wgPSBsaXN0KCJ0cmVhdG1lbnQiID0gY29sb3JfY2F0ZWdvcmljYWxfaGVhdG1hcF9uYW1lZCksICNzZXQgdGhlIG5hbWUgb2YgdGhlIG5hbWVkIGxpc3Qgc28gaXQgbWF0Y2hlcw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICNhbm5vdGF0aW9uX3dpZHRoID0gdW5pdChjKDEsIDQpLCAnY20nKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjZ2FwID0gdW5pdCgxLCAnbW0nKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3dfbGVnZW5kID0gRkFMU0UsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd19hbm5vdGF0aW9uX25hbWUgPSBGQUxTRSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGljaCA9ICdjb2wnLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICNhbHNvIGNyZWF0ZSBhbiBlbXB0eSByb3cgYWJvZSB0aGUgaGVhdG1hcCwgdG8gZGlzcGxheSBhZGRpdGlvbmFsIGluZm8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbXB0eTEgPSBhbm5vX2VtcHR5KGJvcmRlciA9IEZBTFNFLCBoZWlnaHQ9IHVuaXQoOCwgIm1tIikpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKQ0KDQoNCnNpbWlsYXJpdHlfbGlzdF9uYW1lZCA8LSBjKCJsaWdodGNvcmFsIiwgImxpZ2h0c2t5Ymx1ZSIsICJncmF5ODAiLCAid2hpdGUiKQ0KbmFtZXMoc2ltaWxhcml0eV9saXN0X25hbWVkKSA8LSBjKCJNUEkiLCAiQ1BGIiwgIm5laXRoZXIiLCAiYm90aCIpDQoNCmhhID0gcm93QW5ub3RhdGlvbihkZiA9IGRhdGEuZnJhbWUodHJlYXRtZW50ID0gY29ycl9kZltyb3duYW1lcyhjb3JyX2RmKSAlaW4lIHJvd25hbWVzKGNvdW50c19WU1Rfc2VsZWN0ZWRnZW5lcyksInNpbWlsYXJpdHkiXSksICN0aGUgbmFtZSBvZiB0aGUgY29sdW1uIG5lZWRzIHRvIG1hdGNoIHRoZSBuYW1lIG9mIHRoZSBuYW1lZCBsaXN0DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sID0gbGlzdCgidHJlYXRtZW50IiA9IHNpbWlsYXJpdHlfbGlzdF9uYW1lZCksICNzZXQgdGhlIG5hbWUgb2YgdGhlIG5hbWVkIGxpc3Qgc28gaXQgbWF0Y2hlcw0KICAgICAgICAgICAgICAgICAgIHNpbXBsZV9hbm5vX3NpemUgPSB1bml0KDIsICJjbSIpLA0KICAgICAgICAgICAgICAgICAgIGVtcHR5MiA9IGFubm9fZW1wdHkoYm9yZGVyID0gRkFMU0UsIHdpZHRoPSB1bml0KDgsICJtbSIpKQ0KICAgICAgICAgICAgICAgICAgICkNCg0KDQpIZWF0bWFwKG1hdCA9IHQoc2NhbGUodChjb3VudHNfVlNUX3NlbGVjdGVkZ2VuZXMpKSksDQogICAgICAgIG5hbWU9ICJ6LXNjb3JlIiwNCiAgICAgICAgI2NvbHVtbl90aXRsZSA9IGd0X3JlbmRlcigNCiAgICAgICAgIyAgIlBhdHRlcm4gb2YgZXhwcmVzc2lvbiAoYXMgPHNwYW4gc3R5bGU9J2NvbG9yOmJyb3duMic+Kip6LXNjb3JlcyoqPC9zcGFuPikgPGJyLz4gb2YgQ1BGLXVwcmVndWxhdGVkIGdlbmVzIg0KICAgICAgICAjICApLA0KICAgICAgICBjb2wgPSByZXYoYnJld2VyLnBhbCgxMSwiUmRCdSIpKSwNCiAgICAgICAgbmFfY29sID0gImJsYWNrIiwNCiAgICAgICAgY2x1c3Rlcl9yb3dzID0gVCwNCiAgICAgICAgc2hvd19yb3dfZGVuZCA9IFQsDQogICAgICAgICNyb3dfb3JkZXIgPSBvcmRlcmVkX2xldmVscywNCiAgICAgICAgY2x1c3Rlcl9jb2x1bW5zID0gRkFMU0UsDQogICAgICAgIHNob3dfY29sdW1uX2RlbmQgPSBGQUxTRSwNCiAgICAgICAgI2NvbHVtbl9vcmRlciA9IG9yZGVyZWRfbGV2ZWxzLA0KICAgICAgICAjcm93X3NwbGl0ID0gZmFjdG9yKHBhc3RlMChzYW1wbGVfbWV0YWRhdGEkc2VnbWVudCwgc2FtcGxlX21ldGFkYXRhJHN0YWdlKSwgbGV2ZWxzID0gYygibGl2ZXJTMSIsICJsaXZlclM0IiwgImxpdmVyUzciLCAic3RvbWFjaFMxIiwgImludGVzdGluZVMxIiwgInN0b21hY2hTNCIsICJBX2ludGVzdGluZVM0IiwgIlBfaW50ZXN0aW5lUzQiLCAic3RvbWFjaFM3IiwgIkFfaW50ZXN0aW5lUzciLCAiUF9pbnRlc3RpbmVTNyIpKSwNCiAgICAgICAgY29sdW1uX3NwbGl0ID0gZmFjdG9yKHNhbXBsZV9tZXRhZGF0YSR0cmVhdG1lbnQsIGxldmVscyA9IGMoIkRNU08iLCAiVDNJT1AiLCAiTVBJIiwgIkNQRiIsICJDUEYuVDNJT1AiKSksDQogICAgICAgICNjbHVzdGVyX3Jvd19zbGljZXMgPSBGQUxTRSwNCiAgICAgICAgY2x1c3Rlcl9jb2x1bW5fc2xpY2VzID0gRkFMU0UsDQogICAgICAgIHJvd190aXRsZSA9IE5VTEwsDQogICAgICAgIHJvd19nYXAgPSB1bml0KDAuNSwgIm1tIiksDQogICAgICAgIGNvbHVtbl9nYXAgPSB1bml0KGMocmVwKDEwLDEpLCByZXAoMiwzKSksICJtbSIpLA0KICAgICAgICAjd2lkdGggPSB1bml0KDgsICJjbSIpLCANCiAgICAgICAgI2hlaWdodCA9IHVuaXQoOCwgImNtIiksDQogICAgICAgIGNvbHVtbl9uYW1lc19ncCA9IGdyaWQ6OmdwYXIoZm9udHNpemUgPSA4KSwNCiAgICAgICAgcm93X25hbWVzX2dwID0gZ3JpZDo6Z3Bhcihmb250c2l6ZSA9IDgpLA0KICAgICAgICB0b3BfYW5ub3RhdGlvbiA9IGNvbEFubiwNCiAgICAgICAgcmlnaHRfYW5ub3RhdGlvbiA9IGhhLA0KICAgICAgICBzaG93X3Jvd19uYW1lcyA9IEZBTFNFLA0KICAgICAgICBzaG93X2NvbHVtbl9uYW1lcyA9IEZBTFNFLA0KICAgICAgICBzaG93X2hlYXRtYXBfbGVnZW5kID0gRiwNCiAgICAgICAgYm9yZGVyID0gVFJVRSwNCiAgICAgICAgY2x1c3RlcmluZ19tZXRob2Rfcm93cyA9ICd3YXJkLkQyJw0KICAgICAgICAjdXNlX3Jhc3RlciA9IFRSVUUsIHJhc3Rlcl9tYWdpY2tfZmlsdGVyID0gIkdhdXNzaWFuIg0KICAgICAgICApDQoNCg0KbGlicmFyeShHZXRvcHRMb25nKSAgIyBmb3IgdGhlIGZ1bmN0aW9uIHFxKCkNCmdyb3VwX2Jsb2NrX2Fubm8gPSBmdW5jdGlvbihncm91cCwgZW1wdHlfYW5ubywgZ3AgPSBncGFyKCksIA0KICAgIGxhYmVsID0gTlVMTCwgbGFiZWxfZ3AgPSBncGFyKCkpIHsNCg0KICAgIHNlZWtWaWV3cG9ydChxcSgiYW5ub3RhdGlvbl9Ae2VtcHR5X2Fubm99X0B7bWluKGdyb3VwKX0iKSkNCiAgICBsb2MxID0gZGV2aWNlTG9jKHggPSB1bml0KDAsICJucGMiKSwgeSA9IHVuaXQoMCwgIm5wYyIpKQ0KICAgIHNlZWtWaWV3cG9ydChxcSgiYW5ub3RhdGlvbl9Ae2VtcHR5X2Fubm99X0B7bWF4KGdyb3VwKX0iKSkNCiAgICBsb2MyID0gZGV2aWNlTG9jKHggPSB1bml0KDEsICJucGMiKSwgeSA9IHVuaXQoMSwgIm5wYyIpKQ0KDQogICAgc2Vla1ZpZXdwb3J0KCJnbG9iYWwiKQ0KICAgIGdyaWQucmVjdChsb2MxJHgsIGxvYzEkeSwgd2lkdGggPSBsb2MyJHggLSBsb2MxJHgsIGhlaWdodCA9IGxvYzIkeSAtIGxvYzEkeSwgDQogICAgICAgIGp1c3QgPSBjKCJsZWZ0IiwgImJvdHRvbSIpLCBncCA9IGdwKQ0KICAgIGlmKCFpcy5udWxsKGxhYmVsKSkgew0KICAgICAgICBncmlkLnRleHQobGFiZWwsIHggPSAobG9jMSR4ICsgbG9jMiR4KSowLjUsIHkgPSAobG9jMSR5ICsgbG9jMiR5KSowLjUsIGdwID0gbGFiZWxfZ3ApDQogICAgfQ0KfQ0KDQpncm91cF9ibG9ja19hbm5vKDE6MSwgImVtcHR5MSIsIGdwID0gZ3BhcihmaWxsID0gImdyYXk3MCIpLCBsYWJlbCA9ICJETVNPIikNCmdyb3VwX2Jsb2NrX2Fubm8oMjoyLCAiZW1wdHkxIiwgZ3AgPSBncGFyKGZpbGwgPSAicGFsZWdyZWVuMyIpLCBsYWJlbCA9ICJUMytJT1AiKQ0KZ3JvdXBfYmxvY2tfYW5ubygzOjMsICJlbXB0eTEiLCBncCA9IGdwYXIoZmlsbCA9ICJsaWdodGNvcmFsIiksIGxhYmVsID0gIk1QSSIpDQpncm91cF9ibG9ja19hbm5vKDQ6NCwgImVtcHR5MSIsIGdwID0gZ3BhcihmaWxsID0gImxpZ2h0c2t5Ymx1ZSIpLCBsYWJlbCA9ICJDUEYiKQ0KZ3JvdXBfYmxvY2tfYW5ubyg1OjUsICJlbXB0eTEiLCBncCA9IGdwYXIoZmlsbCA9ICJvcmNoaWQyIiksIGxhYmVsID0gIkNQRitUMytJT1AiKQ0KDQoNCmBgYA0KDQoNCg0KDQojIyMjIyBlZmZlY3Qgb2YgQ1BGLlQzIChDUEZUMyB2cyBETVNPKQ0KDQoNCmBgYHtyLCBlY2hvPUZBTFNFLCByZXN1bHRzID0gRkFMU0V9DQojTG9hZCB2b29tIG9iamVjdCAiREdFX29iamVjdF9maWx0ZXJlZG5vcm1lZF9Wb29tZWQiIGZvciBkaWZmZXJlbnRpYWwgZXhwcmVzc2lvbiBhbmFseXNpcywgYW5kIGFubm90YXRpb24gaW5mbw0KbG9hZCgiRDovL0FvY2VsbGFyaXNfQ1BGX01QSV9UMy9TYXZlZF9vYmplY3RzL0RHRV9vYmplY3RfZmlsdGVyZWRub3JtZWRfVm9vbWVkLnJkcyIpDQpsb2FkKCJDOi8vVXNlcnMvRG9jdG9yL0Rlc2t0b3AvUk5Bc2VxX2FuYWx5c2VzL2Fubm90YXRpb25faW5mb19OQ0JJRW5zZW1ibF9jdXJhdGVkLnJkcyIpIA0KDQojcmVuYW1lIHRoZSBkYXRhZnJhbWUgYXMgImFubm90YXRpb25faW5mbyINCmFubm90YXRpb25faW5mbyA8LSBhbm5vdGF0aW9uX2luZm9fTkNCSUVuc2VtYmwNCiNyZW1vdmUgdGhlIGNvbHVtbiB3aXRoIHRoZSBvcmlnaW5hbCBkZXNjcmlwdGlvbg0KI2Fubm90YXRpb25faW5mbyA8LSBzdWJzZXQoYW5ub3RhdGlvbl9pbmZvLCBzZWxlY3QgPSAtYyhvcmlnaW5hbF9kZXNjcmlwdGlvbikpDQoNCiNyZW1vdmUgdW51c2VkIHZhcmlhYmxlcw0Kcm0oYW5ub3RhdGlvbl9pbmZvX05DQklFbnNlbWJsKQ0KDQojLS0tLS0tLS0tLQ0KDQojIGFwcGx5IGxpbmVhciByZWdyZXNzaW9uIG1vZGVsIHdpdGggbWVhbi12YXJpYW5jZSByZWxhdGlvbnNoaXAgd2VpZ2h0cyBjYWxjdWxhdGVkIGFib3ZlDQojIGxtRml0IGZpdHMgYSBsaW5lYXIgbW9kZWwgdXNpbmcgd2VpZ2h0ZWQgbGVhc3Qgc3F1YXJlcyBmb3IgZWFjaCBnZW5lOg0KI2V4dHJhY3QgdGhlIGxpbmVhciBtb2RlbHMgdGhhdCBoYWQgYmVlbiBmaXQgaW4gdGhlIHZvb20gb2JqZWN0DQpmaXRfcmVzdWx0cyA8LSBsbUZpdChER0Vfb2JqZWN0X2ZpbHRlcmVkbm9ybWVkX1Zvb21lZCkgI3RoaXMgaXMgdGhlIHNhbWUgYXMgZG9pbmcgI2ZpdF9yZXN1bHRzIDwtIGxtRml0KERHRV9vYmplY3RfZmlsdGVyZWRub3JtZWRfVm9vbWVkLCB3ZWlnaHRzPURHRV9vYmplY3RfZmlsdGVyZWRub3JtZWRfVm9vbWVkW1sid2VpZ2h0cyJdXSkNCg0KI3NhbWUgYXMgZG9pbmcgbG0oKSBpbmRpdmlkdWFsbHkgb24gZWFjaCBnZW5lIChjYW4gYWxzbyBzdXBwbHkgaGVyZSB0aGUgbW9kZWwgbWF0cml4LCBidXQgYWxyZWFkeSBpbmNvcnBvcmF0ZWQgdGhyb3VnaCB2b29taW5nKQ0KaGVhZChjb2VmKGZpdF9yZXN1bHRzKSkNCmBgYA0KDQoNCmBgYHtyIGVjaG89RkFMU0UsIGZpZy5oZWlnaHQ9Mi41LCBmaWcud2lkdGg9OSwgd2FybmluZz1UUlVFLCBwYWdlZC5wcmludD1GQUxTRX0NCiNDb21wdXRlIGNvbXBhcmlzb25zIG9mIGludGVyZXN0DQoNCiNDb21wYXJpc29ucyBiZXR3ZWVuIGdyb3VwcyAobG9nIGZvbGQtY2hhbmdlcykgYXJlIG9idGFpbmVkIGFzIGNvbnRyYXN0cyBvZiB0aGVzZSBmaXR0ZWQgbGluZWFyIG1vZGVsczoNCmNvbnRyYXN0X21hdHJpeCA8LSBtYWtlQ29udHJhc3RzKHRyZWF0bWVudENQRi5UM0lPUCAgLSB0cmVhdG1lbnRETVNPICwgICMgcG9zaXRpdmUgbG9nY2hhbmdlcyB3aWxsIGJlIGhpZ2hlciBpbiBTNCwgbmVnYXRpdmUgd2lsbCBiZSBoaWdoZXIgaW4gUzENCiAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gY29sbmFtZXMoY29lZihmaXRfcmVzdWx0cykpKQ0KI3Nob3cgbmV3bHkgY3JlYXRlZCBjb250cmFzdCBtYXRyaXgNCmNvbnRyYXN0X21hdHJpeCAgIyBwb3NpdGl2ZSBsb2djaGFuZ2VzIHdpbGwgYmUgaGlnaGVyIGluIFM0LCBuZWdhdGl2ZSB3aWxsIGJlIGhpZ2hlciBpbiBTMQ0KDQojYWRkIHRoZSBjb250cmFzdCBtYXRyaXggdG8gb3VyIGZpdCBvYmplY3QNCiMgbmVlZCB0byBkbyBuZXcgb2JqZWN0cyBvciBpdCBjaGVuZ2VzICBjb2VmZmljaWVudHMgaW5zdGVhZD8NCmZpdF9yZXN1bHRzX2NvbnRyYXN0ZWQgPC0gY29udHJhc3RzLmZpdChmaXRfcmVzdWx0cywgY29udHJhc3RfbWF0cml4KQ0KDQojRW1waXJpY2FsIEJheWVzIHNtb290aGluZyBvZiBzdGFuZGFyZCBlcnJvcnMgKHNocmlua3Mgc3RhbmRhcmQgZXJyb3JzIHRoYXQgYXJlIG11Y2ggbGFyZ2VyIG9yIHNtYWxsZXIgdGhhbiB0aG9zZSBmcm9tIG90aGVyIGdlbmVzIHRvd2FyZHMgdGhlIGF2ZXJhZ2Ugc3RhbmRhcmQgZXJyb3IpIChzZWUgaHR0cHM6Ly93d3cuZGVncnV5dGVyLmNvbS9kb2kvMTAuMjIwMi8xNTQ0LTYxMTUuMTAyNykNCmZpdF9yZXN1bHRzX2NvbnRyYXN0ZWQgPC0gZUJheWVzKGZpdF9yZXN1bHRzX2NvbnRyYXN0ZWQpICN3aGVuIGFwcGxpZWQgdG8gdGhlIG91dHB1dCBvZiBsbUZpdCgpLCBwZXJmb3JtcyB0aGUgcG9vbGVkIGVzdGltYXRpb24gb2Ygc3RhbmRhcmQgZXJyb3JzIHRoYXQgcmVzdWx0cyBpbiB0aGUgbW9kZXJhdGVkIHQtc3RhdGlzdGljcyBhbmQgcmVzdWx0aW5nIHAtdmFsdWVzLg0KDQojcC5hZGp1c3QgKGJ1dCB0aGlzIHdpbGwgYmUgZG9uZSBhdXRvbWF0aWNhbGx5IGJ5IFRvcFRhYmxlIGZ1bmN0aW9uKQ0KI2luZGl2LlAudmFsdWVzPC1hcHBseSh0bXBbWyJwLnZhbHVlIl1dLCAyLCBwLmFkanVzdCwgbWV0aG9kPSJCSCIpDQojdG1wW1siQkguYWRqdXN0ZWQucHZhbHVlIl1dIDwtIGluZGl2LlAudmFsdWVzDQoNCg0KI3JlbW92ZSB1bnVzZWQgdmFyaWFibGVzDQpybShmaXRfcmVzdWx0cywgREdFX29iamVjdF9maWx0ZXJlZG5vcm1lZF9Wb29tZWQpDQpgYGANCjxici8+DQpCZWxvdywgYSBsaXN0IG9mIGFsbCB0aGUgZ2VuZXMgdGhhdCBhcHBlYXIgc2lnbmlmaWNhbnRseSBkaWZmZXJlbnRseSBleHByZXNzZWQgYmV0d2VlbiB0cmVhdG1lbnQgYW5kIGNvbnRyb2wgKGluIGVpdGhlciBkaXJlY3Rpb247IF9fVGFibGUgMV9fKS4gSW4gX19UYWJsZSAyX18sIHRoZSBzdWJlc3Qgb2Ygc2lnbmlmaWNhbnRseSBjaGFuZ2luZyBnZW5lcyB3aG9zZSBmb2xkLWNoYW5nZSBpcyBiaWdnZXIgdGhhbiAyZm9sZHMgKGluIGVpdGhlciBkaXJlY3Rpb24pLiBUaGVzZSBnZW5lcyBhcmUgcmFua2VkIGluIG9yZGVyIG9mIGRlY3JlYXNpbmcgZm9sZCBjaGFuZ2UuIDxici8+DQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KI1doYXQgZ2VuZXMgYXJlIG1vc3QgZGlmZmVyZW50aWFsbHkgZXhwcmVzc2VkPw0KZnVsbF90b3BfdGFibGUgPC0gdG9wVGFibGUoZml0X3Jlc3VsdHNfY29udHJhc3RlZCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICBzb3J0LmJ5ID0gImxvZ0ZDIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICBuID0gSW5mLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkanVzdC5tZXRob2Q9IkJIIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpbnQ9MC45NSwgI25vdGUgdGhhdCB0aGVzZSBhcmUgbm90IGFkanVzdGVkIGZvciBtdWx0aXBsZSB0ZXN0aW5nIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgI3AudmFsdWU9MC4wNQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgKQ0KDQojY3JlYXRlIGNvbHVtbiB0aGF0IHNob3dzIGxvZ0ZvbGRDaGFuZ2UgYXMgdGhlIEZvbGQgQ2hhbmdlDQpmdWxsX3RvcF90YWJsZVsiRkMiXSA8LSBzaWduKGZ1bGxfdG9wX3RhYmxlWyJsb2dGQyJdKSoyXmFicyhmdWxsX3RvcF90YWJsZVsibG9nRkMiXSkNCg0KI3NhdmUgbGlzdA0KI3NhdmUoZnVsbF90b3BfdGFibGUsIGZpbGUgPSAiRDovL0FvY2VsbGFyaXNfQ1BGX01QSV9UMy9TYXZlZF9vYmplY3RzL2Z1bGxfdG9wX3RhYmxlX0NQRlQzSU9QdnNETVNPLnJkcyIpDQojbG9hZChmaWxlID0gIkM6Ly9Vc2Vycy9Eb2N0b3IvRGVza3RvcC9STkFzZXFfYW5hbHlzZXMvQW9jZWxsYXJpc19ndXRfbWV0YW1vcnBob3Npc19saXZlci9TYXZlZF9vYmplY3RzL2Z1bGxfdG9wX3RhYmxlX1M0dnNTMS5yZHMiKQ0KYGBgDQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KI2ZpbmQgZ2VuZXMgd2l0aCBhZGp1c3RlZCBwdmFsdWUNCnNpZ25pZmljYW50IDwtIGZ1bGxfdG9wX3RhYmxlJGFkai5QLlZhbCA8IDAuMDUNCiNzdWJzZXQgZ2VuZXMgdGhhdCBhcmUgc2lnbmlmaWNhbnRseSB1cHJlZ3VsYXRlZA0KdXByZWd1bGF0ZWQgPC0gc2lnbmlmaWNhbnQgJiBzaWduKGZ1bGxfdG9wX3RhYmxlJEZDKSA9PSAxDQojc3ViZXN0IGdlbmUgdGhhdCBhcmUgc2lnbmlmaWNhbnRseSBkb3ducmVndWxhdGVkDQpkb3ducmVndWxhdGVkIDwtIHNpZ25pZmljYW50ICYgc2lnbihmdWxsX3RvcF90YWJsZSRGQykgPT0gLTENCiNmaW5kIGdlbmVzIHRoYXQgY2hhbmdlIG1vcmUgdGhhbiAyeCAobG9nMihGQyk+PTEgb3IgLTEpDQpjaGFuZ2luZyA8LSAoc2lnbihmdWxsX3RvcF90YWJsZSRGQykqbG9nMihhYnMoZnVsbF90b3BfdGFibGUkRkMpKSA+IDEgfCAoc2lnbihmdWxsX3RvcF90YWJsZSRGQykqbG9nMihhYnMoZnVsbF90b3BfdGFibGUkRkMpKSkgPCAtMSkNCg0KDQojZ2VuZXMgdGhhdCBhcmUgbmVpdGhlciBzaWduaWZpY2FudCBub3IgY2hhbmdpbmcNCm5laXRoZXIgPC0gIXNpZ25pZmljYW50ICYgIWNoYW5naW5nDQojZ2VuZXMgdGhhdCBhcmUgY2hhbmdpbmcgYnV0IG5vdCBzaWduaWZpY2FudA0Kbm90c2lnbmlmaWNhbnRfaGlnaCA8LSAhc2lnbmlmaWNhbnQgJiBjaGFuZ2luZw0KI2dlbmVzIHRoYXQgYXJlIHNpZ25pZmljYW50IGJ1dCBub3QgY2hhbmdpbmcNCnNpZ25pZmljYW50X2xvdyA8LSBzaWduaWZpY2FudCAmICFjaGFuZ2luZw0KI2ZpbmQgZ2VuZXMgdGhhdCBhcmUgYm90aCBzaWduaWZpY2FudCBhbmQgY2hhbmdpbmcNCmJvdGggPC0gc2lnbmlmaWNhbnQgJiBjaGFuZ2luZw0KYGBgDQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KI2FkanVzdCBjb25maWRlbmNlIGludGVydmFscyBpZiB3ZSBhcmUgdG8gb25seSBzZWxlY3QgYSBzdWJzZXQgb2YgZ2VuZXMgKGluIG91ciBjYXNlLCBzaWduaWZpY2FudCBnZW5lcykNCiNzZWUgaHR0cHM6Ly9tb25hc2hiaW9pbmZvcm1hdGljc3BsYXRmb3JtLmdpdGh1Yi5pby9yLWxpbmVhci1hYmFjYnMyMDE4L3RvcGljcy9saW5lYXJfbW9kZWxzX2FiYWNiczIwMTguaHRtbA0KI2ZpbmQgZ2VuZXMgd2hpY2ggd2UgY29uc2lkZXIgInNlbGVjdGVkIiAoc2lnbmlmaWNhbnQsIG9yIHNpZ25pZmljYW50IEFORCBsb2cyIGNoYW5naW5nKQ0KDQpwcm9wX2JvdGggPC0gbWVhbihjaGFuZ2luZykgIyJzaWduaWZpY2FudCBpcyBhIDAvMSBib29sZWFuIHNvIHRoZSBtZWFuIGlzIHRoZSBwcm9wb3J0aW9uIA0KI2RvdWJsZSBjaGVjayBoZXJlIG9uIHdoeSB1c2luZyBtZWFuKGJvdGgpIGdpdmVzIG5vbi1zaWduaWZpY2FudCBDSXMgdGhvdWdoIHRoZSBhZGoucC52YWx1ZSBpcyBzaWduaWZpY2FudC4NCmZjcl9jb25maW50IDwtIDEgLSAwLjA1KnByb3BfYm90aA0KI3NvIG5vdyByZXBsYWNlIHRoZSBjb25maWRlbmNlIGludGVydmFsIHZhbHVlcw0KDQpmdWxsX3RvcF90YWJsZSA8LSB0b3BUYWJsZShmaXRfcmVzdWx0c19jb250cmFzdGVkLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvcnQuYnkgPSAibG9nRkMiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gPSBJbmYsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRqdXN0Lm1ldGhvZD0iQkgiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmludD1mY3JfY29uZmludCwgI3RoZXNlIGFyZSBub3cgYWRqdXN0ZWQsIHdoZW4gd2UgYXJlIGp1c3QgY29uc2lkZXJpbmcgdGhlIHNpZ25pZmljYW50IGdlbmVzDQogICAgICAgICAgICAgICAgICAgICAgICAgICAjcC52YWx1ZT0wLjA1DQogICAgICAgICAgICAgICAgICAgICAgICAgICApDQoNCiNvbmx5IGtlZXAgcm93IHBhc3QgcC52YWx1ZSB0aHJlc2hvbGQNCiN0b3AudGFibGUgPC0gdG9wLnRhYmxlW3RvcC50YWJsZSRhZGouUC5WYWwgPD0gMC41LCBdDQojY3JlYXRlIGNvbHVtbiB0aGF0IHNob3dzIGxvZ0ZvbGRDaGFuZ2UgYXMgdGhlIEZvbGQgQ2hhbmdlDQpmdWxsX3RvcF90YWJsZVsiRkMiXSA8LSBzaWduKGZ1bGxfdG9wX3RhYmxlWyJsb2dGQyJdKSoyXmFicyhmdWxsX3RvcF90YWJsZVsibG9nRkMiXSkNCg0KDQojb25seSBrZWVwIGNvbHVtbnMgd2UgYXJlIGludGVyZXN0ZWQgaW4NCnRvcF90YWJsZSA8LSBmdWxsX3RvcF90YWJsZVtjKCJsb2dGQyIsICJGQyIsICJQLlZhbHVlIiwiYWRqLlAuVmFsIiwiZW50cmV6X0lEIiwgIm1lcmdlZF9zeW1ib2wiLCJtZXJnZWRfZGVzY3JpcHRpb24iLCJlbnNlbWJsX2Rlc2NyaXB0aW9uIiwgIkF2ZUV4cHIiLCAiQ0kuTCIsICJDSS5SIiwidCIpXQ0KDQojcmVtb3ZlIHJvd25hbWVzIChub3cgcmVkdW5kYW50KQ0Kcm93bmFtZXModG9wX3RhYmxlKSA8LSBOVUxMDQoNCmZvcm1hdHRhYmxlKHRvcF90YWJsZVt0b3BfdGFibGUkZW50cmV6X0lEICVpbiUgdG9wX3RhYmxlJGVudHJlel9JRFtib3RoICYgdXByZWd1bGF0ZWRdLCBdWzE6MjAsXSwgDQogICAgICAgICAgICAgY2FwdGlvbiA9IlRvcDIwIGdlbmVzIHVwcmVndWxhdGVkIGdlbmVzIChDUEYpOyBGQz4yLCBhZGoucCA8MC4wNTsgcmFua2VkIGJ5IGxvZ0ZDIiwNCiAgICAgICAgICAgICNhbGlnbiA9YygiYyIsImwiLCAibCIsICJjIiksIA0KICAgICAgICAgICAgbGlzdCgjYGVudHJlel9JRGAgPSBmb3JtYXR0ZXIoInNwYW4iLCANCiAgICAgICAgICAgICAgICAjICAgICAgICAgICAgICAgICAgICAgIHN0eWxlID0geCB+IHN0eWxlKA0KICAgICAgICAgICAgICAgICMgICAgICAgICAgICAgICAgICAgICAgICBjb2xvciA9ICIjQTlBOUE5IiwgZm9udC53ZWlnaHQgPSAiYm9sZCIpDQogICAgICAgICAgICAgICAgIyAgICAgICAgICAgICAgICAgICAgICApLCANCiAgICAgICAgICAgICAgICAgYGxvZ0ZDYD0gY29sb3JfdGlsZShOQSwiZG9kZ2VyYmx1ZSIpDQoNCiAgICAgICAgICAgICAgICAgKQ0KICAgICAgICAgICAgKQ0KDQoNCiMgbGlzdCB0b3AgZ2VuZXMgaGlnaGVyIGluIEd1dCB0dWJlDQoja2FibGUodG9wX3RhYmxlW3RvcF90YWJsZSRlbnRyZXpfSUQgJWluJSB0b3BfdGFibGUkZW50cmV6X0lEW2JvdGggJiBkb3ducmVndWxhdGVkXSwgXVsxOjIwLF0sIGNhcHRpb24gPSAiVG9wMjAgZG93bnJlZ3VsYXRlZCBnZW5lcyAoQ1BGKTsgRkM8MS8yLCBhZGoucCA8MC4wNTsgcmFua2VkIGJ5IGxvZ0ZDIikNCg0KDQpmb3JtYXR0YWJsZSh0b3BfdGFibGVbdG9wX3RhYmxlJGVudHJlel9JRCAlaW4lIHRvcF90YWJsZSRlbnRyZXpfSURbYm90aCAmIGRvd25yZWd1bGF0ZWRdLCBdWzE6MjAsXSwgDQogICAgICAgICAgICAgY2FwdGlvbiA9IlRvcDIwIGRvd25yZWd1bGF0ZWQgZ2VuZXMgKENQRik7IEZDPDEvMiwgYWRqLnAgPDAuMDU7IHJhbmtlZCBieSBsb2dGQyIsDQogICAgICAgICAgICAjYWxpZ24gPWMoImMiLCJsIiwgImwiLCAiYyIpLCANCiAgICAgICAgICAgIGxpc3QoI2BlbnRyZXpfSURgID0gZm9ybWF0dGVyKCJzcGFuIiwgDQogICAgICAgICAgICAgICAgIyAgICAgICAgICAgICAgICAgICAgICBzdHlsZSA9IHggfiBzdHlsZSgNCiAgICAgICAgICAgICAgICAjICAgICAgICAgICAgICAgICAgICAgICAgY29sb3IgPSAiI0E5QTlBOSIsIGZvbnQud2VpZ2h0ID0gImJvbGQiKQ0KICAgICAgICAgICAgICAgICMgICAgICAgICAgICAgICAgICAgICAgKSwgDQogICAgICAgICAgICAgICAgIGBsb2dGQ2A9IGNvbG9yX3RpbGUoImxpZ2h0Y29yYWwiLCBOQSkNCg0KICAgICAgICAgICAgICAgICApDQogICAgICAgICAgICApDQoNCg0KI3JlbW92ZSB1bnVzZWQgdmFyaWFibGVzDQpybShwcm9wX2JvdGgsIGZjcl9jb25maW50ICkNCmBgYA0KDQpgYGB7ciwgZWNobz1GQUxTRX0NCkNQRi5UM0lPUF91cHJlZ3VsYXRlZCA8LSB0b3BfdGFibGVbdG9wX3RhYmxlJGVudHJlel9JRCAlaW4lIHRvcF90YWJsZSRlbnRyZXpfSURbYm90aCAmIHVwcmVndWxhdGVkXSwgXVssNV0NCkNQRi5UM0lPUF9kb3ducmVndWxhdGVkPC0gdG9wX3RhYmxlW3RvcF90YWJsZSRlbnRyZXpfSUQgJWluJSB0b3BfdGFibGUkZW50cmV6X0lEW2JvdGggJiBkb3ducmVndWxhdGVkXSwgXVssNV0NCiNzYXZlKENQRi5UM0lPUF91cHJlZ3VsYXRlZCwgZmlsZSA9ICJEOi8vQW9jZWxsYXJpc19DUEZfTVBJX1QzL1NhdmVkX29iamVjdHMvQ1BGVDNJT1BfdXByZWd1bGF0ZWRfZ2VuZXMucmRzIikNCiNzYXZlKENQRi5UM0lPUF9kb3ducmVndWxhdGVkLCBmaWxlID0gIkQ6Ly9Bb2NlbGxhcmlzX0NQRl9NUElfVDMvU2F2ZWRfb2JqZWN0cy9DUEZUM0lPUF9kb3ducmVndWxhdGVkX2dlbmVzLnJkcyIpDQpgYGANCg0KYGBge3IsIGVjaG89RkFMU0V9DQojTGV0IHVzIHByaW50IGEgc3VtbWFyeSByZXByZXNlbnRhdGlvbiBvZiB0aGUgZGlmZmVyZW50aWFsbHkgZXhwcmVzc2VkIGdlbmVzDQpwYXN0ZTAoc3VtbWFyeShjaGFuZ2luZyAmIHNpZ25pZmljYW50KVszXSAsIiBkaWZmZXJlbnRpYWxseSBleHByZXNzZWQgZ2VuZXMgKFAgPDAuMDUsIEZDPDEvMiBPUiBGQz4yKToiKQ0KcGFzdGUwKHN1bW1hcnkoY2hhbmdpbmcgJiB1cHJlZ3VsYXRlZClbM10gLCIgZ2VuZXMgdXByZWd1bGF0ZWQgYnkgQ1BGK1QzIikNCnBhc3RlMChzdW1tYXJ5KGNoYW5naW5nICYgZG93bnJlZ3VsYXRlZClbM10gLCIgZ2VuZXMgZG93bnJlZ3VsYXRlZCBieSBDUEYrVDMiKQ0KYGBgDQpgYGB7ciwgZWNobz1GQUxTRSwgZmlnLndpZHRoPTQsIGZpZy5oZWlnaHQ9NH0NCiNhbmQgdGhlIGNvcnJlc3BvbmRpbmcgcGxvdA0KDQpnZ3Bsb3QodG9wX3RhYmxlLCBhZXMoeD1BdmVFeHByLCB5PXNpZ24oRkMpKmxvZzIoYWJzKEZDKSkpKSArIA0KICBnZW9tX3BvaW50KGRhdGE9dG9wX3RhYmxlW25laXRoZXIsXSwgc2l6ZT0wLjUsIGNvbG9yPSJncmF5NjAiLCBhbHBoYT0wLjEpICsNCiAgZ2VvbV9wb2ludChkYXRhPXRvcF90YWJsZVtub3RzaWduaWZpY2FudF9oaWdoLF0sIHNpemU9MC44LCBjb2xvcj0iZ3JheTYwIiwgYWxwaGE9MC41KSsNCiAgZ2VvbV9wb2ludChkYXRhPXRvcF90YWJsZVtzaWduaWZpY2FudF9sb3csXSwgc2l6ZT0wLjgsIGNvbG9yPSJncmF5NDAiLCBhbHBoYT0wLjUpKw0KICBnZW9tX3BvaW50KGRhdGE9dG9wX3RhYmxlW2JvdGgsXSwgc2l6ZT0xLCBjb2xvcj1pZmVsc2UodG9wX3RhYmxlW2JvdGgsICJsb2dGQyJdPjAsImRvZGdlcmJsdWUyIiwibGlnaHRjb3JhbCIpLCBhbHBoYT0wLjUpKw0KICAgdGhlbWVfYncoKSt0aGVtZShwYW5lbC5ib3JkZXIgPSBlbGVtZW50X3JlY3QoY29sb3I9Im9yY2hpZDIiLCBmaWxsPU5BLCBsaW5ld2lkdGg9IDIpKSsNCiAgIHlsaW0oLTE1LDE1KSsNCiAgeWxhYigibG9nMihDUEYrVDMvRE1TTykiKSsNCiAgeGxhYigiQXZlcmFnZSBFeHByZXNzaW9uIikrIA0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQ9MSwgY29sb3IgPSAiZG9kZ2VyYmx1ZTIiLCBsaW5ld2lkdGg9MC4xKSsgIyBjYW4gYWRkIGxpbmV0eXBlPSJkYXNoZWQiDQogIGdlb21faGxpbmUoeWludGVyY2VwdD0tMSwgY29sb3IgPSAibGlnaHRjb3JhbCIsIGxpbmV3aWR0aD0wLjEpDQoNCmBgYA0KDQoNCg0KDQojIyMjIHstfSANCg0KIyMjIENvbXBhcmlzb25zIGJldHdlZW4gZGlmZmVyZW50aWFsbHkgZXhwcmVzc2VkIGdlbmVzDQpWZW5uIGludGVyc2VjdGlvbiBiZXR3ZWVuIENQRiwgVDMsIGFuZCBNUEkNCg0KYGBge3IsIGVjaG89RkFMU0UsIGZpZy53aWR0aD0xMiwgZmlnLmhlaWdodD02fQ0KI2xvYWQgYWxsIHRoZSBsaXN0cyBvZiB1cHJlZ3VsYXRlZCBhbmQgZG93bnJlZ3VsYXRlZCBnZW5lcyBpbiBlYWNoIHRyZWF0bWVudCBjb25kaXRpb24NCmxvYWQoIkQ6Ly9Bb2NlbGxhcmlzX0NQRl9NUElfVDMvU2F2ZWRfb2JqZWN0cy9DUEZfdXByZWd1bGF0ZWRfZ2VuZXMucmRzIikNCmxvYWQoIkQ6Ly9Bb2NlbGxhcmlzX0NQRl9NUElfVDMvU2F2ZWRfb2JqZWN0cy9UM0lPUF91cHJlZ3VsYXRlZF9nZW5lcy5yZHMiKQ0KbG9hZCgiRDovL0FvY2VsbGFyaXNfQ1BGX01QSV9UMy9TYXZlZF9vYmplY3RzL01QSV91cHJlZ3VsYXRlZF9nZW5lcy5yZHMiKQ0KbG9hZCgiRDovL0FvY2VsbGFyaXNfQ1BGX01QSV9UMy9TYXZlZF9vYmplY3RzL0NQRlQzSU9QX3VwcmVndWxhdGVkX2dlbmVzLnJkcyIpDQoNCg0KbG9hZCgiRDovL0FvY2VsbGFyaXNfQ1BGX01QSV9UMy9TYXZlZF9vYmplY3RzL0NQRl9kb3ducmVndWxhdGVkX2dlbmVzLnJkcyIpDQpsb2FkKCJEOi8vQW9jZWxsYXJpc19DUEZfTVBJX1QzL1NhdmVkX29iamVjdHMvVDNJT1BfZG93bnJlZ3VsYXRlZF9nZW5lcy5yZHMiKQ0KbG9hZCgiRDovL0FvY2VsbGFyaXNfQ1BGX01QSV9UMy9TYXZlZF9vYmplY3RzL01QSV9kb3ducmVndWxhdGVkX2dlbmVzLnJkcyIpDQpsb2FkKCJEOi8vQW9jZWxsYXJpc19DUEZfTVBJX1QzL1NhdmVkX29iamVjdHMvQ1BGVDNJT1BfZG93bnJlZ3VsYXRlZF9nZW5lcy5yZHMiKQ0KDQpsb2FkKCJEOi8vQW9jZWxsYXJpc19DUEZfTVBJX1QzL1NhdmVkX29iamVjdHMvdG9wX3RhYmxlX0NQRi5yZHMiKQ0KbG9hZCgiRDovL0FvY2VsbGFyaXNfQ1BGX01QSV9UMy9TYXZlZF9vYmplY3RzL3RvcF90YWJsZV9NUEkucmRzIikNCmxvYWQoIkQ6Ly9Bb2NlbGxhcmlzX0NQRl9NUElfVDMvU2F2ZWRfb2JqZWN0cy90b3BfdGFibGVfVDNJT1AucmRzIikNCg0KeCA8LSBsaXN0KFQzPVQzSU9QX3VwcmVndWxhdGVkLA0KICAgICAgICAgIE1QST1NUElfdXByZWd1bGF0ZWQsDQogICAgICAgICAgQ1BGPUNQRl91cHJlZ3VsYXRlZA0KICAgICAgICAgICNDUEZUM0lPUF91cD1DUEYuVDNJT1BfdXByZWd1bGF0ZWQNCiAgICAgICAgICApDQpwbG90MSA8LSBnZ1Zlbm5EaWFncmFtKHgpICsgc2NhbGVfY29sb3JfYnJld2VyKHBhbGV0dGUgPSAiUGFpcmVkIikrZ2d0aXRsZSgiVXByZWd1bGF0ZWQgZ2VuZXMiKQ0KDQoNCnkgPC0gbGlzdChUMz1UM0lPUF9kb3ducmVndWxhdGVkLA0KICAgICAgICAgIE1QST1NUElfZG93bnJlZ3VsYXRlZCwNCiAgICAgICAgICBDUEY9Q1BGX2Rvd25yZWd1bGF0ZWQNCiAgICAgICAgICAjQ1BGVDNJT1BfdXA9Q1BGLlQzSU9QX3VwcmVndWxhdGVkDQogICAgICAgICAgKQ0KcGxvdDIgPC0gZ2dWZW5uRGlhZ3JhbSh5KSArIHNjYWxlX2NvbG9yX2JyZXdlcihwYWxldHRlID0gIlBhaXJlZCIpK2dndGl0bGUoIkRvd25yZWd1bGF0ZWQgZ2VuZXMiKQ0KDQpncmlkLmFycmFuZ2UocGxvdDEsIHBsb3QyLCBuY29sPTIsIG5yb3c9MSkNCmBgYA0KVmVubiBpbnRlcnNlY3Rpb24gYmV0d2VlbiBDUEYsIFQzLCBhbmQgQ1BGVDNJT1ANCg0KYGBge3IsIGVjaG89RkFMU0UsIGZpZy53aWR0aD0xMiwgZmlnLmhlaWdodD02fQ0KI2xvYWQgYWxsIHRoZSBsaXN0cyBvZiB1cHJlZ3VsYXRlZCBhbmQgZG93bnJlZ3VsYXRlZCBnZW5lcyBpbiBlYWNoIHRyZWF0bWVudCBjb25kaXRpb24NCmxvYWQoIkQ6Ly9Bb2NlbGxhcmlzX0NQRl9NUElfVDMvU2F2ZWRfb2JqZWN0cy9DUEZfdXByZWd1bGF0ZWRfZ2VuZXMucmRzIikNCmxvYWQoIkQ6Ly9Bb2NlbGxhcmlzX0NQRl9NUElfVDMvU2F2ZWRfb2JqZWN0cy9UM0lPUF91cHJlZ3VsYXRlZF9nZW5lcy5yZHMiKQ0KbG9hZCgiRDovL0FvY2VsbGFyaXNfQ1BGX01QSV9UMy9TYXZlZF9vYmplY3RzL01QSV91cHJlZ3VsYXRlZF9nZW5lcy5yZHMiKQ0KbG9hZCgiRDovL0FvY2VsbGFyaXNfQ1BGX01QSV9UMy9TYXZlZF9vYmplY3RzL0NQRlQzSU9QX3VwcmVndWxhdGVkX2dlbmVzLnJkcyIpDQoNCg0KbG9hZCgiRDovL0FvY2VsbGFyaXNfQ1BGX01QSV9UMy9TYXZlZF9vYmplY3RzL0NQRl9kb3ducmVndWxhdGVkX2dlbmVzLnJkcyIpDQpsb2FkKCJEOi8vQW9jZWxsYXJpc19DUEZfTVBJX1QzL1NhdmVkX29iamVjdHMvVDNJT1BfZG93bnJlZ3VsYXRlZF9nZW5lcy5yZHMiKQ0KbG9hZCgiRDovL0FvY2VsbGFyaXNfQ1BGX01QSV9UMy9TYXZlZF9vYmplY3RzL01QSV9kb3ducmVndWxhdGVkX2dlbmVzLnJkcyIpDQpsb2FkKCJEOi8vQW9jZWxsYXJpc19DUEZfTVBJX1QzL1NhdmVkX29iamVjdHMvQ1BGVDNJT1BfZG93bnJlZ3VsYXRlZF9nZW5lcy5yZHMiKQ0KDQpsb2FkKCJEOi8vQW9jZWxsYXJpc19DUEZfTVBJX1QzL1NhdmVkX29iamVjdHMvdG9wX3RhYmxlX0NQRi5yZHMiKQ0KbG9hZCgiRDovL0FvY2VsbGFyaXNfQ1BGX01QSV9UMy9TYXZlZF9vYmplY3RzL3RvcF90YWJsZV9NUEkucmRzIikNCmxvYWQoIkQ6Ly9Bb2NlbGxhcmlzX0NQRl9NUElfVDMvU2F2ZWRfb2JqZWN0cy90b3BfdGFibGVfVDNJT1AucmRzIikNCg0KeCA8LSBsaXN0KFQzPVQzSU9QX3VwcmVndWxhdGVkLA0KICAgICAgICAgIENQRlQzSU9QPUNQRi5UM0lPUF91cHJlZ3VsYXRlZCwNCiAgICAgICAgICBDUEY9Q1BGX3VwcmVndWxhdGVkDQogICAgICAgICAgI0NQRlQzSU9QX3VwPUNQRi5UM0lPUF91cHJlZ3VsYXRlZA0KICAgICAgICAgICkNCnBsb3QxIDwtIGdnVmVubkRpYWdyYW0oeCkgKyBzY2FsZV9jb2xvcl9icmV3ZXIocGFsZXR0ZSA9ICJQYWlyZWQiKStnZ3RpdGxlKCJVcHJlZ3VsYXRlZCBnZW5lcyIpDQoNCg0KeSA8LSBsaXN0KFQzPVQzSU9QX2Rvd25yZWd1bGF0ZWQsDQogICAgICAgICAgQ1BGVDNJT1A9Q1BGLlQzSU9QX2Rvd25yZWd1bGF0ZWQsDQogICAgICAgICAgQ1BGPUNQRl9kb3ducmVndWxhdGVkDQogICAgICAgICAgI0NQRlQzSU9QX3VwPUNQRi5UM0lPUF91cHJlZ3VsYXRlZA0KICAgICAgICAgICkNCnBsb3QyIDwtIGdnVmVubkRpYWdyYW0oeSkgKyBzY2FsZV9jb2xvcl9icmV3ZXIocGFsZXR0ZSA9ICJQYWlyZWQiKStnZ3RpdGxlKCJEb3ducmVndWxhdGVkIGdlbmVzIikNCg0KZ3JpZC5hcnJhbmdlKHBsb3QxLCBwbG90MiwgbmNvbD0yLCBucm93PTEpDQpgYGANCg0KDQpgYGB7ciwgZWNobz1GQUxTRX0NCiNmaW5kIGdlbmVzIGluIGVhY2ggaW50ZXJzZWN0aW9uICh0cmVhdG1lbnQtaW5kZXBlbmRlbnQpDQp1cHJlZ3VsYXRlZF9hbGwgPC0gUmVkdWNlKGludGVyc2VjdCwgbGlzdChUM0lPUF91cHJlZ3VsYXRlZCxNUElfdXByZWd1bGF0ZWQsQ1BGX3VwcmVndWxhdGVkKSkNCmFubm90YXRpb25faW5mb1thbm5vdGF0aW9uX2luZm8kZW50cmV6X0lEICVpbiUgdXByZWd1bGF0ZWRfYWxsLGMoImVudHJlel9JRCIsICJtZXJnZWRfc3ltYm9sIiwgIm1lcmdlZF9kZXNjcmlwdGlvbiIpXQ0KDQp1cHJlZ3VsYXRlZF9IUFQgPC0gc2V0ZGlmZihSZWR1Y2UoaW50ZXJzZWN0LCBsaXN0KFQzSU9QX3VwcmVndWxhdGVkLE1QSV91cHJlZ3VsYXRlZCkpLCB1cHJlZ3VsYXRlZF9hbGwpDQphbm5vdGF0aW9uX2luZm9bYW5ub3RhdGlvbl9pbmZvJGVudHJlel9JRCAlaW4lIHVwcmVndWxhdGVkX0hQVCxjKCJlbnRyZXpfSUQiLCAibWVyZ2VkX3N5bWJvbCIsICJtZXJnZWRfZGVzY3JpcHRpb24iKV0NCg0KZG93bnJlZ3VsYXRlZF9hbGwgPC0gUmVkdWNlKGludGVyc2VjdCwgbGlzdChUM0lPUF9kb3ducmVndWxhdGVkLE1QSV9kb3ducmVndWxhdGVkLENQRl9kb3ducmVndWxhdGVkKSkNCmFubm90YXRpb25faW5mb1thbm5vdGF0aW9uX2luZm8kZW50cmV6X0lEICVpbiUgZG93bnJlZ3VsYXRlZF9hbGwsYygiZW50cmV6X0lEIiwgIm1lcmdlZF9zeW1ib2wiLCAibWVyZ2VkX2Rlc2NyaXB0aW9uIildDQoNCmRvd25yZWd1bGF0ZWRfSFBUIDwtIHNldGRpZmYoUmVkdWNlKGludGVyc2VjdCwgbGlzdChUM0lPUF9kb3ducmVndWxhdGVkLE1QSV9kb3ducmVndWxhdGVkKSksIGRvd25yZWd1bGF0ZWRfYWxsKQ0KYW5ub3RhdGlvbl9pbmZvW2Fubm90YXRpb25faW5mbyRlbnRyZXpfSUQgJWluJSBkb3ducmVndWxhdGVkX0hQVCxjKCJlbnRyZXpfSUQiLCAibWVyZ2VkX3N5bWJvbCIsICJtZXJnZWRfZGVzY3JpcHRpb24iKV0NCmBgYA0KDQpGaW5kIGdlbmVzIGluIGV2ZXJ5IGludGVyc2VjdGlvbiAoQ1BGLCBUM0lPUCwgTVBJKQ0KDQpgYGB7ciwgZWNobz1GQUxTRX0NCiNmaW5kIGdlbmVzIGluIGVhY2ggaW50ZXJzZWN0aW9uICh1cHJlZ3VsYXRlZCkNCmxvYWQoIkQ6Ly9Bb2NlbGxhcmlzX0NQRl9NUElfVDMvU2F2ZWRfb2JqZWN0cy9tZXJnZWRfdG9wX3RhYmxlX1QzSU9QX0NQRi5yZHMiKQ0KbG9hZCgiRDovL0FvY2VsbGFyaXNfQ1BGX01QSV9UMy9TYXZlZF9vYmplY3RzL21lcmdlZF90b3BfdGFibGVfTVBJX0NQRi5yZHMiKQ0KDQp1cHJlZ3VsYXRlZF9DUEZhbmRUM0lPUCA8LSBzZXRkaWZmKFJlZHVjZShpbnRlcnNlY3QsIGxpc3QoVDNJT1BfdXByZWd1bGF0ZWQsQ1BGX3VwcmVndWxhdGVkKSksIHVwcmVndWxhdGVkX2FsbCkNCnVwcmVndWxhdGVkX0NQRmFuZFQzSU9QX2RmIDwtIG1lcmdlZF90b3BfdGFibGVfQ1BGX1QzSU9QW21lcmdlZF90b3BfdGFibGVfQ1BGX1QzSU9QJGVudHJlel9JRCAlaW4lIHVwcmVndWxhdGVkX0NQRmFuZFQzSU9QLF0NCiNjcmVhdGUgYSBnbG9iYWwgcmFua2luZyBtZXRob2QNCnVwcmVndWxhdGVkX0NQRmFuZFQzSU9QX2RmIDwtIHVwcmVndWxhdGVkX0NQRmFuZFQzSU9QX2RmW29yZGVyKGFicyh1cHJlZ3VsYXRlZF9DUEZhbmRUM0lPUF9kZiRGQ19UM0lPUCksIGRlY3JlYXNpbmcgPSBUUlVFKSxdDQp1cHJlZ3VsYXRlZF9DUEZhbmRUM0lPUF9kZiRyYW5rX1QzSU9QIDwtIHNlcSgxOm5yb3codXByZWd1bGF0ZWRfQ1BGYW5kVDNJT1BfZGYpKQ0KdXByZWd1bGF0ZWRfQ1BGYW5kVDNJT1BfZGYgPC0gdXByZWd1bGF0ZWRfQ1BGYW5kVDNJT1BfZGZbb3JkZXIoYWJzKHVwcmVndWxhdGVkX0NQRmFuZFQzSU9QX2RmJEZDX0NQRiksIGRlY3JlYXNpbmcgPSBUUlVFKSxdDQp1cHJlZ3VsYXRlZF9DUEZhbmRUM0lPUF9kZiRyYW5rX0NQRiA8LSBzZXEoMTpucm93KHVwcmVndWxhdGVkX0NQRmFuZFQzSU9QX2RmKSkNCnVwcmVndWxhdGVkX0NQRmFuZFQzSU9QX2RmJHJhbmsgPC0gdXByZWd1bGF0ZWRfQ1BGYW5kVDNJT1BfZGYkcmFua19UM0lPUCt1cHJlZ3VsYXRlZF9DUEZhbmRUM0lPUF9kZiRyYW5rX0NQRg0KdXByZWd1bGF0ZWRfQ1BGYW5kVDNJT1BfZGYgPC0gdXByZWd1bGF0ZWRfQ1BGYW5kVDNJT1BfZGZbb3JkZXIodXByZWd1bGF0ZWRfQ1BGYW5kVDNJT1BfZGYkcmFuayksXQ0KdXByZWd1bGF0ZWRfQ1BGYW5kVDNJT1BfZGYgPC0gdXByZWd1bGF0ZWRfQ1BGYW5kVDNJT1BfZGZbLGMoImVudHJlel9JRCIsICJlbnNlbWJsX0lEX0NQRiIsIm1lcmdlZF9zeW1ib2xfQ1BGIiwgIm1lcmdlZF9kZXNjcmlwdGlvbl9DUEYiLCAibG9nRkNfQ1BGIiwgImxvZ0ZDX1QzSU9QIiwgIkZDX0NQRiIsICJGQ19UM0lPUCIsICJyYW5rIildDQoNCiN3cml0ZS5jc3YodXByZWd1bGF0ZWRfQ1BGYW5kVDNJT1BfZGYsIkQ6Ly9Bb2NlbGxhcmlzX0NQRl9NUElfVDMvU2F2ZWRfb2JqZWN0cy9WZW5uL3VwcmVndWxhdGVkX0NQRmFuZFQzSU9QX2NsZWFuLmNzdiIscm93Lm5hbWVzID0gRkFMU0UpDQoNCg0KDQp1cHJlZ3VsYXRlZF9DUEZhbmRNUEkgPC0gc2V0ZGlmZihSZWR1Y2UoaW50ZXJzZWN0LCBsaXN0KE1QSV91cHJlZ3VsYXRlZCxDUEZfdXByZWd1bGF0ZWQpKSwgdXByZWd1bGF0ZWRfYWxsKQ0KdXByZWd1bGF0ZWRfQ1BGYW5kTVBJX2RmIDwtIG1lcmdlZF90b3BfdGFibGVfQ1BGX01QSVttZXJnZWRfdG9wX3RhYmxlX0NQRl9NUEkkZW50cmV6X0lEICVpbiUgdXByZWd1bGF0ZWRfQ1BGYW5kTVBJLCBdDQojY3JlYXRlIGEgZ2xvYmFsIHJhbmtpbmcgbWV0aG9kDQp1cHJlZ3VsYXRlZF9DUEZhbmRNUElfZGYgPC0gdXByZWd1bGF0ZWRfQ1BGYW5kTVBJX2RmW29yZGVyKGFicyh1cHJlZ3VsYXRlZF9DUEZhbmRNUElfZGYkRkNfTVBJKSwgZGVjcmVhc2luZyA9IFRSVUUpLF0NCnVwcmVndWxhdGVkX0NQRmFuZE1QSV9kZiRyYW5rX01QSSA8LSBzZXEoMTpucm93KHVwcmVndWxhdGVkX0NQRmFuZE1QSV9kZikpDQp1cHJlZ3VsYXRlZF9DUEZhbmRNUElfZGYgPC0gdXByZWd1bGF0ZWRfQ1BGYW5kTVBJX2RmW29yZGVyKGFicyh1cHJlZ3VsYXRlZF9DUEZhbmRNUElfZGYkRkNfQ1BGKSwgZGVjcmVhc2luZyA9IFRSVUUpLF0NCnVwcmVndWxhdGVkX0NQRmFuZE1QSV9kZiRyYW5rX0NQRiA8LSBzZXEoMTpucm93KHVwcmVndWxhdGVkX0NQRmFuZE1QSV9kZikpDQp1cHJlZ3VsYXRlZF9DUEZhbmRNUElfZGYkcmFuayA8LSB1cHJlZ3VsYXRlZF9DUEZhbmRNUElfZGYkcmFua19NUEkrdXByZWd1bGF0ZWRfQ1BGYW5kTVBJX2RmJHJhbmtfQ1BGDQp1cHJlZ3VsYXRlZF9DUEZhbmRNUElfZGYgPC0gdXByZWd1bGF0ZWRfQ1BGYW5kTVBJX2RmW29yZGVyKHVwcmVndWxhdGVkX0NQRmFuZE1QSV9kZiRyYW5rKSxdDQp1cHJlZ3VsYXRlZF9DUEZhbmRNUElfZGYgPC0gdXByZWd1bGF0ZWRfQ1BGYW5kTVBJX2RmWyxjKCJlbnRyZXpfSUQiLCAiZW5zZW1ibF9JRF9DUEYiLCJtZXJnZWRfc3ltYm9sX0NQRiIsICJtZXJnZWRfZGVzY3JpcHRpb25fQ1BGIiwgImxvZ0ZDX0NQRiIsICJsb2dGQ19NUEkiLCAiRkNfQ1BGIiwgIkZDX01QSSIsICJyYW5rIildDQoNCiN3cml0ZS5jc3YodXByZWd1bGF0ZWRfQ1BGYW5kTVBJX2RmLCJEOi8vQW9jZWxsYXJpc19DUEZfTVBJX1QzL1NhdmVkX29iamVjdHMvVmVubi91cHJlZ3VsYXRlZF9DUEZhbmRNUElfY2xlYW4uY3N2Iixyb3cubmFtZXMgPSBGQUxTRSkNCg0KDQojZmluZCBnZW5lcyB1bmlxdWVseSB1cHJlZ3VsYXRlZCBpbiBDUEYNCnVwcmVndWxhdGVkX0NQRm9ubHkgPC0gc2V0ZGlmZihDUEZfdXByZWd1bGF0ZWQsIHVwcmVndWxhdGVkX2FsbCkNCnVwcmVndWxhdGVkX0NQRm9ubHkgPC0gc2V0ZGlmZih1cHJlZ3VsYXRlZF9DUEZvbmx5LCB1cHJlZ3VsYXRlZF9DUEZhbmRUM0lPUCkNCnVwcmVndWxhdGVkX0NQRm9ubHkgPC0gc2V0ZGlmZih1cHJlZ3VsYXRlZF9DUEZvbmx5LCB1cHJlZ3VsYXRlZF9DUEZhbmRNUEkpDQp1cHJlZ3VsYXRlZF9DUEZvbmx5X2RmIDwtIHRvcF90YWJsZV9DUEZbdG9wX3RhYmxlX0NQRiRlbnRyZXpfSUQgJWluJSB1cHJlZ3VsYXRlZF9DUEZvbmx5LCBdDQoNCiN3cml0ZS5jc3YodXByZWd1bGF0ZWRfQ1BGb25seV9kZiwiRDovL0FvY2VsbGFyaXNfQ1BGX01QSV9UMy9TYXZlZF9vYmplY3RzL1Zlbm4vdXByZWd1bGF0ZWRfQ1BGb25seV9jbGVhbi5jc3YiLHJvdy5uYW1lcyA9IEZBTFNFKQ0KDQoNCiNmaW5kIGdlbmVzIHVuaXF1ZWx5IHVwcmVndWxhdGVkIGluIFQzDQp1cHJlZ3VsYXRlZF9UM29ubHkgPC0gc2V0ZGlmZihUM0lPUF91cHJlZ3VsYXRlZCwgdXByZWd1bGF0ZWRfYWxsKQ0KdXByZWd1bGF0ZWRfVDNvbmx5IDwtIHNldGRpZmYodXByZWd1bGF0ZWRfVDNvbmx5LCB1cHJlZ3VsYXRlZF9DUEZhbmRUM0lPUCkNCnVwcmVndWxhdGVkX1Qzb25seSA8LSBzZXRkaWZmKHVwcmVndWxhdGVkX1Qzb25seSwgdXByZWd1bGF0ZWRfSFBUKSAjcmVtb3ZlIHVwcmVndWxhdGVkIGluIFQzIGFuZCBNUEkNCnVwcmVndWxhdGVkX1Qzb25seV9kZiA8LSB0b3BfdGFibGVfVDNJT1BbdG9wX3RhYmxlX1QzSU9QJGVudHJlel9JRCAlaW4lIHVwcmVndWxhdGVkX1Qzb25seSwgXQ0KDQojd3JpdGUuY3N2KHVwcmVndWxhdGVkX1Qzb25seV9kZiwiRDovL0FvY2VsbGFyaXNfQ1BGX01QSV9UMy9TYXZlZF9vYmplY3RzL1Zlbm4vdXByZWd1bGF0ZWRfVDNJT1Bvbmx5X2NsZWFuLmNzdiIscm93Lm5hbWVzID0gRkFMU0UpDQoNCiNmaW5kIGdlbmVzIHVuaXF1ZWx5IHVwcmVndWxhdGVkIGluIE1QSQ0KdXByZWd1bGF0ZWRfTVBJb25seSA8LSBzZXRkaWZmKE1QSV91cHJlZ3VsYXRlZCwgdXByZWd1bGF0ZWRfYWxsKQ0KdXByZWd1bGF0ZWRfTVBJb25seSA8LSBzZXRkaWZmKHVwcmVndWxhdGVkX01QSW9ubHksIHVwcmVndWxhdGVkX0NQRmFuZE1QSSkNCnVwcmVndWxhdGVkX01QSW9ubHkgPC0gc2V0ZGlmZih1cHJlZ3VsYXRlZF9NUElvbmx5LCB1cHJlZ3VsYXRlZF9IUFQpICNyZW1vdmUgdXByZWd1bGF0ZWQgaW4gVDMgYW5kIE1QSQ0KdXByZWd1bGF0ZWRfTVBJb25seV9kZiA8LSB0b3BfdGFibGVfTVBJW3RvcF90YWJsZV9NUEkkZW50cmV6X0lEICVpbiUgdXByZWd1bGF0ZWRfTVBJb25seSwgXQ0KDQojd3JpdGUuY3N2KHVwcmVndWxhdGVkX01QSW9ubHlfZGYsIkQ6Ly9Bb2NlbGxhcmlzX0NQRl9NUElfVDMvU2F2ZWRfb2JqZWN0cy9WZW5uL3VwcmVndWxhdGVkX01QSW9ubHlfY2xlYW4uY3N2Iixyb3cubmFtZXMgPSBGQUxTRSkNCmBgYA0KDQpGaW5kIGdlbmVzIGluIGV2ZXJ5IGludGVyc2VjdGlvbiAoQ1BGLCBUM0lPUCwgQ1BGVDNJT1ApDQpgYGB7ciwgZWNobz1GQUxTRX0NCiNmaW5kIGdlbmVzIGluIGVhY2ggaW50ZXJzZWN0aW9uIChkb3ducmVndWxhdGVkKQ0KbG9hZCgiRDovL0FvY2VsbGFyaXNfQ1BGX01QSV9UMy9TYXZlZF9vYmplY3RzL21lcmdlZF90b3BfdGFibGVfVDNJT1BfQ1BGLnJkcyIpDQpsb2FkKCJEOi8vQW9jZWxsYXJpc19DUEZfTVBJX1QzL1NhdmVkX29iamVjdHMvbWVyZ2VkX3RvcF90YWJsZV9NUElfQ1BGLnJkcyIpDQoNCmRvd25yZWd1bGF0ZWRfQ1BGYW5kVDNJT1AgPC0gc2V0ZGlmZihSZWR1Y2UoaW50ZXJzZWN0LCBsaXN0KFQzSU9QX2Rvd25yZWd1bGF0ZWQsQ1BGX2Rvd25yZWd1bGF0ZWQpKSwgZG93bnJlZ3VsYXRlZF9hbGwpDQpkb3ducmVndWxhdGVkX0NQRmFuZFQzSU9QX2RmIDwtIG1lcmdlZF90b3BfdGFibGVfQ1BGX1QzSU9QW21lcmdlZF90b3BfdGFibGVfQ1BGX1QzSU9QJGVudHJlel9JRCAlaW4lIGRvd25yZWd1bGF0ZWRfQ1BGYW5kVDNJT1AsXQ0KICNjcmVhdGUgYSBnbG9iYWwgcmFua2luZyBtZXRob2QNCmRvd25yZWd1bGF0ZWRfQ1BGYW5kVDNJT1BfZGYgPC0gZG93bnJlZ3VsYXRlZF9DUEZhbmRUM0lPUF9kZltvcmRlcihhYnMoZG93bnJlZ3VsYXRlZF9DUEZhbmRUM0lPUF9kZiRGQ19UM0lPUCksIGRlY3JlYXNpbmcgPSBUUlVFKSxdDQpkb3ducmVndWxhdGVkX0NQRmFuZFQzSU9QX2RmJHJhbmtfVDNJT1AgPC0gc2VxKDE6bnJvdyhkb3ducmVndWxhdGVkX0NQRmFuZFQzSU9QX2RmKSkNCmRvd25yZWd1bGF0ZWRfQ1BGYW5kVDNJT1BfZGYgPC0gZG93bnJlZ3VsYXRlZF9DUEZhbmRUM0lPUF9kZltvcmRlcihhYnMoZG93bnJlZ3VsYXRlZF9DUEZhbmRUM0lPUF9kZiRGQ19DUEYpLCBkZWNyZWFzaW5nID0gVFJVRSksXQ0KZG93bnJlZ3VsYXRlZF9DUEZhbmRUM0lPUF9kZiRyYW5rX0NQRiA8LSBzZXEoMTpucm93KGRvd25yZWd1bGF0ZWRfQ1BGYW5kVDNJT1BfZGYpKQ0KZG93bnJlZ3VsYXRlZF9DUEZhbmRUM0lPUF9kZiRyYW5rIDwtIGRvd25yZWd1bGF0ZWRfQ1BGYW5kVDNJT1BfZGYkcmFua19UM0lPUCtkb3ducmVndWxhdGVkX0NQRmFuZFQzSU9QX2RmJHJhbmtfQ1BGDQpkb3ducmVndWxhdGVkX0NQRmFuZFQzSU9QX2RmIDwtIGRvd25yZWd1bGF0ZWRfQ1BGYW5kVDNJT1BfZGZbb3JkZXIoZG93bnJlZ3VsYXRlZF9DUEZhbmRUM0lPUF9kZiRyYW5rKSxdDQpkb3ducmVndWxhdGVkX0NQRmFuZFQzSU9QX2RmIDwtIGRvd25yZWd1bGF0ZWRfQ1BGYW5kVDNJT1BfZGZbLGMoImVudHJlel9JRCIsICJlbnNlbWJsX0lEX0NQRiIsIm1lcmdlZF9zeW1ib2xfQ1BGIiwgIm1lcmdlZF9kZXNjcmlwdGlvbl9DUEYiLCAibG9nRkNfQ1BGIiwgImxvZ0ZDX1QzSU9QIiwgIkZDX0NQRiIsICJGQ19UM0lPUCIsICJyYW5rIildDQoNCiN3cml0ZS5jc3YoZG93bnJlZ3VsYXRlZF9DUEZhbmRUM0lPUF9kZiwiRDovL0FvY2VsbGFyaXNfQ1BGX01QSV9UMy9TYXZlZF9vYmplY3RzL1Zlbm4vZG93bnJlZ3VsYXRlZF9DUEZhbmRUM0lPUF9jbGVhbi5jc3YiLHJvdy5uYW1lcyA9IEZBTFNFKQ0KDQoNCmRvd25yZWd1bGF0ZWRfQ1BGYW5kTVBJIDwtIHNldGRpZmYoUmVkdWNlKGludGVyc2VjdCwgbGlzdChNUElfZG93bnJlZ3VsYXRlZCxDUEZfZG93bnJlZ3VsYXRlZCkpLCBkb3ducmVndWxhdGVkX2FsbCkNCmRvd25yZWd1bGF0ZWRfQ1BGYW5kTVBJX2RmIDwtIG1lcmdlZF90b3BfdGFibGVfQ1BGX01QSVttZXJnZWRfdG9wX3RhYmxlX0NQRl9NUEkkZW50cmV6X0lEICVpbiUgZG93bnJlZ3VsYXRlZF9DUEZhbmRNUEksXQ0KI2NyZWF0ZSBhIGdsb2JhbCByYW5raW5nIG1ldGhvZA0KZG93bnJlZ3VsYXRlZF9DUEZhbmRNUElfZGYgPC0gZG93bnJlZ3VsYXRlZF9DUEZhbmRNUElfZGZbb3JkZXIoYWJzKGRvd25yZWd1bGF0ZWRfQ1BGYW5kTVBJX2RmJEZDX01QSSksIGRlY3JlYXNpbmcgPSBUUlVFKSxdDQpkb3ducmVndWxhdGVkX0NQRmFuZE1QSV9kZiRyYW5rX01QSSA8LSBzZXEoMTpucm93KGRvd25yZWd1bGF0ZWRfQ1BGYW5kTVBJX2RmKSkNCmRvd25yZWd1bGF0ZWRfQ1BGYW5kTVBJX2RmIDwtIGRvd25yZWd1bGF0ZWRfQ1BGYW5kTVBJX2RmW29yZGVyKGFicyhkb3ducmVndWxhdGVkX0NQRmFuZE1QSV9kZiRGQ19DUEYpLCBkZWNyZWFzaW5nID0gVFJVRSksXQ0KZG93bnJlZ3VsYXRlZF9DUEZhbmRNUElfZGYkcmFua19DUEYgPC0gc2VxKDE6bnJvdyhkb3ducmVndWxhdGVkX0NQRmFuZE1QSV9kZikpDQpkb3ducmVndWxhdGVkX0NQRmFuZE1QSV9kZiRyYW5rIDwtIGRvd25yZWd1bGF0ZWRfQ1BGYW5kTVBJX2RmJHJhbmtfTVBJK2Rvd25yZWd1bGF0ZWRfQ1BGYW5kTVBJX2RmJHJhbmtfQ1BGDQpkb3ducmVndWxhdGVkX0NQRmFuZE1QSV9kZiA8LSBkb3ducmVndWxhdGVkX0NQRmFuZE1QSV9kZltvcmRlcihkb3ducmVndWxhdGVkX0NQRmFuZE1QSV9kZiRyYW5rKSxdDQpkb3ducmVndWxhdGVkX0NQRmFuZE1QSV9kZiA8LSBkb3ducmVndWxhdGVkX0NQRmFuZE1QSV9kZlssYygiZW50cmV6X0lEIiwgImVuc2VtYmxfSURfQ1BGIiwibWVyZ2VkX3N5bWJvbF9DUEYiLCAibWVyZ2VkX2Rlc2NyaXB0aW9uX0NQRiIsICJsb2dGQ19DUEYiLCAibG9nRkNfTVBJIiwgIkZDX0NQRiIsICJGQ19NUEkiLCAicmFuayIpXQ0KDQojd3JpdGUuY3N2KGRvd25yZWd1bGF0ZWRfQ1BGYW5kTVBJX2RmLCJEOi8vQW9jZWxsYXJpc19DUEZfTVBJX1QzL1NhdmVkX29iamVjdHMvVmVubi9kb3ducmVndWxhdGVkX0NQRmFuZE1QSV9jbGVhbi5jc3YiLHJvdy5uYW1lcyA9IEZBTFNFKQ0KDQoNCg0KI2ZpbmQgZ2VuZXMgdW5pcXVlbHkgZG93bnJlZ3VsYXRlZCBpbiBDUEYNCmRvd25yZWd1bGF0ZWRfQ1BGb25seSA8LSBzZXRkaWZmKENQRl9kb3ducmVndWxhdGVkLCBkb3ducmVndWxhdGVkX2FsbCkNCmRvd25yZWd1bGF0ZWRfQ1BGb25seSA8LSBzZXRkaWZmKGRvd25yZWd1bGF0ZWRfQ1BGb25seSwgZG93bnJlZ3VsYXRlZF9DUEZhbmRUM0lPUCkNCmRvd25yZWd1bGF0ZWRfQ1BGb25seSA8LSBzZXRkaWZmKGRvd25yZWd1bGF0ZWRfQ1BGb25seSwgZG93bnJlZ3VsYXRlZF9DUEZhbmRNUEkpDQpkb3ducmVndWxhdGVkX0NQRm9ubHlfZGYgPC0gdG9wX3RhYmxlX0NQRlt0b3BfdGFibGVfQ1BGJGVudHJlel9JRCAlaW4lIGRvd25yZWd1bGF0ZWRfQ1BGb25seSwgXQ0KDQojd3JpdGUuY3N2KGRvd25yZWd1bGF0ZWRfQ1BGb25seV9kZiwiRDovL0FvY2VsbGFyaXNfQ1BGX01QSV9UMy9TYXZlZF9vYmplY3RzL1Zlbm4vZG93bnJlZ3VsYXRlZF9DUEZvbmx5X2NsZWFuLmNzdiIscm93Lm5hbWVzID0gRkFMU0UpDQoNCiNmaW5kIGdlbmVzIHVuaXF1ZWx5IGRvd25yZWd1bGF0ZWQgaW4gVDMNCmRvd25yZWd1bGF0ZWRfVDNvbmx5IDwtIHNldGRpZmYoVDNJT1BfZG93bnJlZ3VsYXRlZCwgZG93bnJlZ3VsYXRlZF9hbGwpDQpkb3ducmVndWxhdGVkX1Qzb25seSA8LSBzZXRkaWZmKGRvd25yZWd1bGF0ZWRfVDNvbmx5LCBkb3ducmVndWxhdGVkX0NQRmFuZFQzSU9QKQ0KZG93bnJlZ3VsYXRlZF9UM29ubHkgPC0gc2V0ZGlmZihkb3ducmVndWxhdGVkX1Qzb25seSwgZG93bnJlZ3VsYXRlZF9IUFQpICNpLmUuIHJlbW92ZSBkb3ducmVndWxhdGVkIGluIFQzIGFuZCBNUEkNCmRvd25yZWd1bGF0ZWRfVDNvbmx5X2RmIDwtIHRvcF90YWJsZV9UM0lPUFt0b3BfdGFibGVfVDNJT1AkZW50cmV6X0lEICVpbiUgZG93bnJlZ3VsYXRlZF9UM29ubHksIF0NCg0KI3dyaXRlLmNzdihkb3ducmVndWxhdGVkX1Qzb25seV9kZiwiRDovL0FvY2VsbGFyaXNfQ1BGX01QSV9UMy9TYXZlZF9vYmplY3RzL1Zlbm4vZG93bnJlZ3VsYXRlZF9UM0lPUG9ubHlfY2xlYW4uY3N2Iixyb3cubmFtZXMgPSBGQUxTRSkNCg0KI2ZpbmQgZ2VuZXMgdW5pcXVlbHkgZG93bnJlZ3VsYXRlZCBpbiBNUEkNCmRvd25yZWd1bGF0ZWRfTVBJb25seSA8LSBzZXRkaWZmKE1QSV9kb3ducmVndWxhdGVkLCBkb3ducmVndWxhdGVkX2FsbCkNCmRvd25yZWd1bGF0ZWRfTVBJb25seSA8LSBzZXRkaWZmKGRvd25yZWd1bGF0ZWRfTVBJb25seSwgZG93bnJlZ3VsYXRlZF9DUEZhbmRNUEkpDQpkb3ducmVndWxhdGVkX01QSW9ubHkgPC0gc2V0ZGlmZihkb3ducmVndWxhdGVkX01QSW9ubHksIGRvd25yZWd1bGF0ZWRfSFBUKSAjaS5lLiByZW1vdmUgZG93bnJlZ3VsYXRlZCBpbiBUMyBhbmQgTVBJDQpkb3ducmVndWxhdGVkX01QSW9ubHlfZGYgPC0gdG9wX3RhYmxlX01QSVt0b3BfdGFibGVfTVBJJGVudHJlel9JRCAlaW4lIGRvd25yZWd1bGF0ZWRfTVBJb25seSwgXQ0KDQojd3JpdGUuY3N2KGRvd25yZWd1bGF0ZWRfTVBJb25seV9kZiwiRDovL0FvY2VsbGFyaXNfQ1BGX01QSV9UMy9TYXZlZF9vYmplY3RzL1Zlbm4vZG93bnJlZ3VsYXRlZF9NUElvbmx5X2NsZWFuLmNzdiIscm93Lm5hbWVzID0gRkFMU0UpDQpgYGANCg0KDQoNCg0KIyMjIENvbXBhcmluZyBDUEYgYW5kIENQRitUM0lPUA0KDQpgYGB7ciwgZWNobz1GQUxTRX0NCiMjIExldCB1cyBpbXBvcnQgdGhlIFRvcFRhYmxlcyAodGFibGVzIG9mIGRpZmZlcmVudGlhbGx5IGV4cHJlc3NlZCBnZW5lcykgZnJvbSBlYWNoIGRhdGFzZXQNCiNsb2FkIGxpc3Qgb2YgREUgZ2VuZXMgaW4gdGhlIFQzK0NQRiB0cmVhdG1lbnQNCmxvYWQoIkQ6Ly9Bb2NlbGxhcmlzX0NQRl9NUElfVDMvU2F2ZWRfb2JqZWN0cy9mdWxsX3RvcF90YWJsZV9DUEZUM0lPUHZzRE1TTy5yZHMiKQ0KZnVsbF90b3BfdGFibGVfQ1BGVDNJT1B2c0RNU08gPC0gZnVsbF90b3BfdGFibGUNCiNyZWxvYWQgbGlzdCBvZiBERSBnZW5lcyBpbiB0aGUgQ1BGIHRyZWF0bWVudA0KbG9hZCgiRDovL0FvY2VsbGFyaXNfQ1BGX01QSV9UMy9TYXZlZF9vYmplY3RzL2Z1bGxfdG9wX3RhYmxlX0NQRnZzRE1TTy5yZHMiKQ0KZnVsbF90b3BfdGFibGVfQ1BGdnNETVNPIDwtIGZ1bGxfdG9wX3RhYmxlDQpybShmdWxsX3RvcF90YWJsZSkNCiNwcmVwYXJlIGNvbWJpbmVkIHRhYmxlDQoNCg0KIyMgTGV0IHVzIGxvYWQgdGhlIG1hbnVhbCBhbm5vdGF0aW9uIA0KI3RoZSB0YWJsZSB3aXRoIHRoZSBhbm5vdGF0aW9uIGluZm9ybWF0aW9uIG9mIGVhY2ggZ2VuZSAod2l0aCBtYW51YWwgY3VyYXRpb24gb2YgdGhlIGRlc2NyaXB0aW9uKSwgd2FzIG1hZGUgaW4gYSBzZXBhcmF0ZSBub3RlYm9vayAoY2ZyICJBb2NlbGxhcmlzX2Fubm90YXRpb25pbmZvX21ha2VyLlJtZCkgYW5kIHNhdmVkIGFzIGEgUiBvYmplY3Qgd2hpY2ggd2Ugd2lsbCBsb2FkIGhlcmUuICNhbm5vdGF0aW9uX2luZm9fTkNCSUVuc2VtYmwNCmxvYWQoIkM6Ly9Vc2Vycy9Eb2N0b3IvRGVza3RvcC9STkFzZXFfYW5hbHlzZXMvYW5ub3RhdGlvbl9pbmZvX05DQklFbnNlbWJsX2N1cmF0ZWQucmRzIikgDQoNCiNyZW5hbWUgdGhlIGRhdGFmcmFtZSBhcyAiYW5ub3RhdGlvbl9pbmZvIg0KYW5ub3RhdGlvbl9pbmZvIDwtIGFubm90YXRpb25faW5mb19OQ0JJRW5zZW1ibA0KI3JlbW92ZSB0aGUgY29sdW1uIHdpdGggdGhlIG9yaWdpbmFsIGRlc2NyaXB0aW9uDQojYW5ub3RhdGlvbl9pbmZvIDwtIHN1YnNldChhbm5vdGF0aW9uX2luZm8sIHNlbGVjdCA9IC1jKG9yaWdpbmFsX2Rlc2NyaXB0aW9uKSkNCg0KI3JlbW92ZSB1bnVzZWQgdmFyaWFibGVzDQpybShhbm5vdGF0aW9uX2luZm9fTkNCSUVuc2VtYmwpDQoNCiMjTGV0IHVzIHVwZGF0ZSB0aGUgZ2VuZSBkZXNjcmlwdGlvbnMgd2l0aCB0aGUgbGF0ZXN0IGFubm90YXRpb24sIGp1c3QgaW4gY2FzZSB0aGUgdG9wdGFibGVzIGhhZCBiZWVuIGdlbmVyYXRlZCB1bmRlciB0aGUgb2xkZXIgYW5ub3RhdGlvbg0KI2Z1bGxfdG9wX3RhYmxlX01QSWNvbnRyb2wkZGVzY3JpcHRpb248LWFubm90YXRpb25faW5mb1ttYXRjaChmdWxsX3RvcF90YWJsZV9NUEljb250cm9sJGVuc2VtYmxfZ2VuZV9pZCwgYW5ub3RhdGlvbl9pbmZvJGVuc2VtYmxfZ2VuZV9pZCksImRlc2NyaXB0aW9uIl0NCiNmdWxsX3RvcF90YWJsZV9UM2NvbnRyb2wkZGVzY3JpcHRpb248LWFubm90YXRpb25faW5mb1ttYXRjaChmdWxsX3RvcF90YWJsZV9UM2NvbnRyb2wkZW5zZW1ibF9nZW5lX2lkLCBhbm5vdGF0aW9uX2luZm8kZW5zZW1ibF9nZW5lX2lkKSwiZGVzY3JpcHRpb24iXQ0KDQpgYGANCg0KDQpgYGB7ciwgZWNobz1GQUxTRX0NCmthYmxlKGZ1bGxfdG9wX3RhYmxlX0NQRlQzSU9QdnNETVNPWzE6MjAsXSwgY2FwdGlvbiA9ICJUb3AyMCBkaWZmZXJlbnRpYWxseSBleHByZXNzZWQgZ2VuZXMgaW4gQ1BGVDNJT1AgdnMgY29udHJvbCAoYWxsIEZDIGFuZCBwdmFsdWVzOyByYW5rZWQgYnkgRkMpIikgI2Zyb20gaG93IHdlIGRlZmluZWQgdGhlIGNvbnRyYXN0cywgYSBwb3NpdGl2ZSBGQyBoZXJlID09IGhpZ2hlciBpbiBNUEkNCmthYmxlKGZ1bGxfdG9wX3RhYmxlX0NQRnZzRE1TT1sxOjIwLF0sIGNhcHRpb24gPSAiVG9wMjAgZGlmZmVyZW50aWFsbHkgZXhwcmVzc2VkIGdlbmVzIGluIENQRiB2cyBjb250cm9sIChhbGwgRkMgYW5kIHB2YWx1ZXM7IHJhbmtlZCBieSBGQykiKSAjZnJvbSBob3cgd2UgZGVmaW5lZCB0aGUgY29udHJhc3RzLCBhIG5lZ2F0aXZlIEZDIGhlcmUgPT0gaGlnaGVyIGluIFQzDQoNCiNJbiB0aGlzIGNhc2UsIHRoZSB0d28gdG9wdGFibGUgY29tZSBmcm9tIHRoZSBzYW1lIGRhdGFzZXQsIHNvIGFsbCBnZW5lcyBpbiBvbmUgd2lsbCBhbHNvIGJlIHByZXNlbnQgaW4gdGhlIG90aGVyIG9uZSwgYWQgdGhleSB1bmRlcndlbnQgdGhlIHNhbWUgZmlsdGVyaW5nLiBObyBuZWVkIHRvIHJlbW92ZSBleGNlc3MgZ2VuZXMgaW4gZWl0aGVyIHRhYmxlDQoNCiMjbGV0IHVzIGNyZWF0ZSBhICJtZXJnZWQgdG9wdGFibGUiIHdoZXJlIGdlbmVzIGhhdmUgdGhlIEZDIGZvciBib3RoIGNvbnRyYXN0cw0KIyhub3RpY2UgdGhhdCBub3cgYm90aCB0b3B0YWJsZXMgaGF2ZSB0aGUgc2FtZSBsZW5ndGgpDQptZXJnZWRfdG9wX3RhYmxlIDwtIG1lcmdlKGZ1bGxfdG9wX3RhYmxlX0NQRlQzSU9QdnNETVNPLA0KICAgICAgICAgICAgICAgICAgICAgICAgICBmdWxsX3RvcF90YWJsZV9DUEZ2c0RNU08sDQogICAgICAgICAgICAgICAgICAgICAgICAgIGJ5PSJlbnRyZXpfSUQiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICBzdWZmaXhlcyA9IGMoIl9DUEZUM0lPUCIsIl9DUEYiKSkNCg0KI3Nob3cgZmlyc3QgZW50cmllcyBvZiBtZXJnZWQgdG9wdGFibGUNCiNrYWJsZShtZXJnZWRfdG9wX3RhYmxlWzE6MjAsXSkNCmBgYCANCg0KDQpgYGB7ciwgZWNobz1GQUxTRX0NCiNsZXQgdXMgYWRkIGEgY29sdW1uIHdpdGggdGhlIE1QSSBzdGF0dXMNCm1lcmdlZF90b3BfdGFibGUkTVBJX3N0YXR1cyA8LSAibmVpdGhlciINCg0KZm9yIChpIGluIHNlcSgxOm5yb3cobWVyZ2VkX3RvcF90YWJsZSkpKSB7DQogIGlmIChtZXJnZWRfdG9wX3RhYmxlJGVudHJlel9JRFtpXSAlaW4lIE1QSV91cHJlZ3VsYXRlZCkgew0KICAgIG1lcmdlZF90b3BfdGFibGUkTVBJX3N0YXR1c1tpXSA8LSAiVVAiDQogIH0NCiAgDQogIGlmIChtZXJnZWRfdG9wX3RhYmxlJGVudHJlel9JRFtpXSAlaW4lIE1QSV9kb3ducmVndWxhdGVkKXsNCiAgICBtZXJnZWRfdG9wX3RhYmxlJE1QSV9zdGF0dXNbaV0gPC0gIkRPV04iDQogIH0NCiAgDQogIA0KfQ0KYGBgDQoNCmBgYHtyLGZpZy5oZWlnaHQ9NSwgZmlnLndpZHRoPTYsIGVjaG89RkFMU0V9DQojcGxvdA0KcGxvdDEgPC0gZ2dwbG90KG1lcmdlZF90b3BfdGFibGUsIGFlcyh4PXNpZ24oRkNfQ1BGVDNJT1ApKmxvZzIoYWJzKEZDX0NQRlQzSU9QKSksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5PXNpZ24oRkNfQ1BGKSpsb2cyKGFicyhGQ19DUEYpKSkpICsNCiAgZ2VvbV9wb2ludChkYXRhPW1lcmdlZF90b3BfdGFibGUsIHNpemU9MC4xLCBjb2xvcj0iZ3JheTYwIiwgYWxwaGE9MC4xKSsNCiAgI2NvbnRyYXN0IFggc3BlY2lmaWMgKGkuZS4gd2VyZSBub3QgREUgaW4gY29udHJhc3QgWSkNCiAgZ2VvbV9wb2ludChkYXRhPW1lcmdlZF90b3BfdGFibGVbbWVyZ2VkX3RvcF90YWJsZSRhZGouUC5WYWxfQ1BGVDNJT1AgPCAwLjA1JiBhYnMobWVyZ2VkX3RvcF90YWJsZSRsb2dGQ19DUEZUM0lPUCkgPiAxICYgYWJzKG1lcmdlZF90b3BfdGFibGUkbG9nRkNfQ1BGKSA8IDEsXSwgc2l6ZT0xLCBjb2xvcj0icGFsZWdyZWVuMyIsIGFscGhhPTAuMykgKyAjZGlmZmVyZW50aWFsbHkgZXhwcmVzc2VkIGdlbmVzIGluIE1QSSBvbmx5DQogICNjb250cmFzdCBZIHNwZWNpZmljIChpLmUuIHdlcmUgbm90IERFIGluIGNvbnRyYXN0IFgpDQogIGdlb21fcG9pbnQoZGF0YT1tZXJnZWRfdG9wX3RhYmxlW21lcmdlZF90b3BfdGFibGUkYWRqLlAuVmFsX0NQRiA8IDAuMDUmIGFicyhtZXJnZWRfdG9wX3RhYmxlJGxvZ0ZDX0NQRikgPiAxICYgYWJzKG1lcmdlZF90b3BfdGFibGUkbG9nRkNfQ1BGVDNJT1ApIDwgMSxdLCBzaXplPTEsIGNvbG9yPSJsaWdodHNreWJsdWUiLCBhbHBoYT0wLjEpICsgI2RpZmZlcmVudGlhbGx5IGV4cHJlc3NlZCBnZW5lcyBpbiBDUEYgb25seQ0KICAjIHdlcmUgREUgZm9yIGJvdGggY29udHJhc3QgWCBhbmQgWQ0KICAgICAgZ2VvbV9wb2ludChkYXRhPW1lcmdlZF90b3BfdGFibGVbbWVyZ2VkX3RvcF90YWJsZSRhZGouUC5WYWxfQ1BGVDNJT1AgPCAwLjA1JiBtZXJnZWRfdG9wX3RhYmxlJGxvZ0ZDX0NQRlQzSU9QID4gMSAmIG1lcmdlZF90b3BfdGFibGUkYWRqLlAuVmFsX0NQRiA8IDAuMDUgJiBtZXJnZWRfdG9wX3RhYmxlJGxvZ0ZDX0NQRiA+IDEsXSwgc2l6ZT0xLjIsIA0KICAgICAgICAgICAgIGNvbG9yPSJvcmNoaWQiLCANCiAgICAgICAgICAgICBhbHBoYT0wLjgpICsNCiAgICAgICAgZ2VvbV9wb2ludChkYXRhPW1lcmdlZF90b3BfdGFibGVbbWVyZ2VkX3RvcF90YWJsZSRhZGouUC5WYWxfQ1BGVDNJT1AgPCAwLjA1JiBtZXJnZWRfdG9wX3RhYmxlJGxvZ0ZDX0NQRlQzSU9QIDwgKDAtMSkgJiBtZXJnZWRfdG9wX3RhYmxlJGFkai5QLlZhbF9DUEYgPCAwLjA1ICYgbWVyZ2VkX3RvcF90YWJsZSRsb2dGQ19DUEYgPCAoMC0xKSxdLCBzaXplPTEuMiwgDQogICAgICAgICAgICAgY29sb3I9Im9yY2hpZCIsIA0KICAgICAgICAgICAgIGFscGhhPTAuOCkgKw0KICAgIGdlb21fcG9pbnQoZGF0YT1tZXJnZWRfdG9wX3RhYmxlW21lcmdlZF90b3BfdGFibGUkYWRqLlAuVmFsX0NQRlQzSU9QIDwgMC4wNSYgbWVyZ2VkX3RvcF90YWJsZSRsb2dGQ19DUEZUM0lPUCA8IC0xICYgbWVyZ2VkX3RvcF90YWJsZSRhZGouUC5WYWxfQ1BGIDwgMC4wNSAmIG1lcmdlZF90b3BfdGFibGUkbG9nRkNfQ1BGID4gMSxdLCBzaXplPTEuMiwgDQogICAgICAgICAgICAgY29sb3I9InNhbmR5YnJvd24iLCANCiAgICAgICAgICAgICBhbHBoYT0wLjgpICsNCiAgICAgIGdlb21fcG9pbnQoZGF0YT1tZXJnZWRfdG9wX3RhYmxlW21lcmdlZF90b3BfdGFibGUkYWRqLlAuVmFsX0NQRlQzSU9QIDwgMC4wNSYgbWVyZ2VkX3RvcF90YWJsZSRsb2dGQ19DUEZUM0lPUCA+IDEgJiBtZXJnZWRfdG9wX3RhYmxlJGFkai5QLlZhbF9DUEYgPCAwLjA1ICYgbWVyZ2VkX3RvcF90YWJsZSRsb2dGQ19DUEYgPCAoMC0xKSxdLCBzaXplPTEuMiwgDQogICAgICAgICAgICAgY29sb3I9InNhbmR5YnJvd24iLCANCiAgICAgICAgICAgICBhbHBoYT0wLjgpICsNCiAgI25vdyBhZGQgdGhlIHNhbWUgY2F0ZWdvcmllcywgYnV0IHRob3NlIHRoYXQgZGlkIG5vdCBwYXNzIGZvbGRjaGFuZ2UgdGhyZXNob2xkDQogICNjb250cmFzdCBYIHNwZWNpZmljIChpLmUuIHdlcmUgbm90IERFIGluIGNvbnRyYXN0IFkpDQogIGdlb21fcG9pbnQoZGF0YT1tZXJnZWRfdG9wX3RhYmxlW21lcmdlZF90b3BfdGFibGUkYWRqLlAuVmFsX0NQRlQzSU9QIDwgMC4wNSYgYWJzKG1lcmdlZF90b3BfdGFibGUkbG9nRkNfQ1BGVDNJT1ApIDw9IDEsXSwgc2l6ZT0xLCBjb2xvcj0iZ3JheTQwIiwgYWxwaGE9MC4xKSArIA0KICAjY29udHJhc3QgWSBzcGVjaWZpYyAoaS5lLiB3ZXJlIG5vdCBERSBpbiBjb250cmFzdCBYKQ0KICBnZW9tX3BvaW50KGRhdGE9bWVyZ2VkX3RvcF90YWJsZVttZXJnZWRfdG9wX3RhYmxlJGFkai5QLlZhbF9UMyA8IDAuMDUmIGFicyhtZXJnZWRfdG9wX3RhYmxlJGxvZ0ZDX0NQRikgPD0gMSxdLCBzaXplPTEsIGNvbG9yPSJncmF5NDAiLCBhbHBoYT0wLjEpICsNCiAgIyB3ZXJlIERFIGZvciBib3RoIGNvbnRyYXQgWCBhbmQgWQ0KICBnZW9tX3BvaW50KGRhdGE9bWVyZ2VkX3RvcF90YWJsZVttZXJnZWRfdG9wX3RhYmxlJGFkai5QLlZhbF9DUEZUM0lPUCA8IDAuMDUmIGFicyhtZXJnZWRfdG9wX3RhYmxlJGxvZ0ZDX0NQRlQzSU9QKSA8PSAxICYgbWVyZ2VkX3RvcF90YWJsZSRhZGouUC5WYWxfQ1BGIDwgMC4wNSAmIGFicyhtZXJnZWRfdG9wX3RhYmxlJGxvZ0ZDX0NQRikgPD0gMSxdLCBzaXplPTEuMiwgY29sb3I9ImdyYXk0MCIsIGFscGhhPTAuMSkgKw0KDQogIHhsaW0oLTExLDExKSsNCiAgeWxpbSgtMTEsMTEpKw0KICB4bGFiKCc8c3BhbiBzdHlsZSA9ICJjb2xvcjpncmF5NjAiPkhpZ2hlciBpbiBETVNPPC08L3NwYW4+IGxvZzIoQ1BGVDNJT1AvRE1TTyBGb2xkIENoYW5nZSkgPHNwYW4gc3R5bGUgPSAiY29sb3I6Z3JheTYwIj4tPiBIaWdoZXIgaW4gQ1BGVDNJT1A8L3NwYW4+JykrDQogIHlsYWIoJzxzcGFuIHN0eWxlID0gImNvbG9yOmdyYXk2MCI+SGlnaGVyIGluIERNU08gPC08L3NwYW4+IGxvZzIoQ1BGL0RNU08gRm9sZCBDaGFuZ2UpIDxzcGFuIHN0eWxlID0gImNvbG9yOmdyYXk2MCI+LT4gSGlnaGVyIGluIENQRjwvc3Bhbj4nKSsgDQogIGdlb21faGxpbmUoeWludGVyY2VwdD0xLCBjb2xvciA9ICJncmF5NDAiLCBsaW5ld2lkdGg9MC4xKSsgIyBjYW4gYWRkIGxpbmV0eXBlPSJkYXNoZWQiDQogIGdlb21faGxpbmUoeWludGVyY2VwdD0tMSwgY29sb3IgPSAiZ3JheTQwIiwgbGluZXdpZHRoPTAuMSkrDQogIGdlb21fdmxpbmUoeGludGVyY2VwdD0xLCBjb2xvciA9ICJncmF5NDAiLCBsaW5ld2lkdGg9MC4xKSsNCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0PS0xLCBjb2xvciA9ICJncmF5NDAiLCBsaW5ld2lkdGg9MC4xKSsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0PTAsIGNvbG9yID0gImdyYXk4NSIsIHNpemU9MC4xKSsgDQogIGdlb21fdmxpbmUoeGludGVyY2VwdD0wLCBjb2xvciA9ICJncmF5ODUiLCBzaXplPTAuMSkrDQogIGdndGl0bGUoJ0RpZmZlcmVudGlhbGx5IGV4cHJlc3NlZCBnZW5lcyBpbiAqKkNQRlQzSU9QKiogdnMgKipDUEYqKicpKw0KICBsYWJzKHN1YnRpdGxlID0gJzxzcGFuIHN0eWxlID0gImNvbG9yOmRvZGdlcmJsdWUyIj4gREUgaW4gQ1BGIG9ubHk8L3NwYW4+LCANCiAgICAgICA8c3BhbiBzdHlsZSA9ICJjb2xvcjpwYWxlZ3JlZW4zIj5ERSBpbiBDUEZUM0lPUCBvbmx5PC9zcGFuPiwgPGJyLz4NCiAgICAgICA8c3BhbiBzdHlsZSA9ICJjb2xvcjpvcmNoaWQiPkRFIGluIHNhbWUgZGlyZWN0aW9uPC9zcGFuPiwNCiAgICAgICA8c3BhbiBzdHlsZSA9ICJjb2xvcjpzYW5keWJyb3duIj5ERSBpbiBvcHBvc2l0ZSBkaXJlY3Rpb248L3NwYW4+JykrDQogIHRoZW1lX2J3KCkrdGhlbWUocGxvdC50aXRsZSA9IGdndGV4dDo6ZWxlbWVudF9tYXJrZG93bigpLA0KICAgICAgICAgICAgICAgICAgIHBsb3Quc3VidGl0bGUgPSBnZ3RleHQ6OmVsZW1lbnRfbWFya2Rvd24oKSwNCiAgICAgICAgICAgICAgICAgICBheGlzLnRpdGxlLnggPSBnZ3RleHQ6OmVsZW1lbnRfbWFya2Rvd24oKSwNCiAgICAgICAgICAgICAgICAgICBheGlzLnRpdGxlLnkgPSBnZ3RleHQ6OmVsZW1lbnRfbWFya2Rvd24oKSkNCiAgTlVMTA0KDQpwbG90MQ0KDQoNCiNib3R0b21sZWZ0OiBnZW5lcyB0aGF0IGFyZSBoaWdoZXIgaW4gY29udHJvbCAobG93ZXJlZCkgdW5kZXIgYW55IGludGVydmVudGlvbi4gSS5lLiBnZW5lcyBkb3ducmVndWxhdGVkIHRvIGV4cGVyaW1lbnRhbCBlLmcuIHN0cmVzcw0KI3RvcHJpZ2h0OiBnZW5lcyB0aGF0IGluY3JlYXNlZCBieSBlaXRoZXIgdHJlYXRtZW50LiBpLmUuIGdlbmVzIHVwcmVndWxhdGVkIGR1ZSB0byBlLmcuIGV4cGVyaW1lbnRhbCBzdHJlc3M/DQoNCiN0b3BsZWZ0OiBnZW5lcyB0aGF0IGFyZSB1bmRlciBwb3NpdGl2ZSByZWd1bGF0aW9uIGJ5IFQzIChoaWdoZXIgdGhhbiBjb250cm9sIHVuZGVyIFQzLCBhbmQgbG93ZXIgdGhhbiBjb250cm9sIChsb3dlcmVkKSB1bmRlciBNUEkpDQojYm90dG9tcmlnaHQ6IGdlbmVzIHRoYXQgYXJlIHJlcHJlc3NlZCBieSBUMyAoaGlnaGVyIGluIE1QSSB0aGFuIGNvbnRyb2wsIGFuZCBoaWdoZXIgaW4gY29udHJvbCAobG93ZXJlZCkgaW4gVDMpDQpgYGANCg0KDQpgYGB7cixmaWcuaGVpZ2h0PTUsIGZpZy53aWR0aD02LCBlY2hvPUZBTFNFfQ0KcGxvdDENCnBsb3QxICsgZ2VvbV9wb2ludChkYXRhPW1lcmdlZF90b3BfdGFibGVbbWVyZ2VkX3RvcF90YWJsZSRlbnRyZXpfSUQgJWluJSBzZWxlY3RlZF9nZW5lcyxdLCBzaXplPTIsIGNvbG9yPSJsaWdodGNvcmFsIiwgYWxwaGE9MSkgDQpwbG90MSArIGdlb21fcG9pbnQoZGF0YT1tZXJnZWRfdG9wX3RhYmxlW21lcmdlZF90b3BfdGFibGUkTVBJX3N0YXR1cyA9PSAiRE9XTiIsXSwgc2l6ZT0xLCBjb2xvcj0ibGlnaHRjb3JhbCIsIGFscGhhPTEpIA0KYGBgDQoNCg0KQXR0ZW51YXRpb24gcGxvdA0KYGBge3IsZmlnLmhlaWdodD01LCBmaWcud2lkdGg9NiwgZWNobz1GQUxTRX0NCiNwbG90DQpwbG90MSA8LSBnZ3Bsb3QobWVyZ2VkX3RvcF90YWJsZSwgYWVzKHk9c2lnbihGQ19DUEZUM0lPUCkqbG9nMihhYnMoRkNfQ1BGVDNJT1ApKSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHg9c2lnbihGQ19DUEYpKmxvZzIoYWJzKEZDX0NQRikpKSkgKw0KICBnZW9tX3BvaW50KGRhdGE9bWVyZ2VkX3RvcF90YWJsZSwgc2l6ZT0wLjUsIGNvbG9yPSJncmF5NjAiLCBhbHBoYT0wLjEpICsNCmdlb21fcG9pbnQoZGF0YT1tZXJnZWRfdG9wX3RhYmxlW21lcmdlZF90b3BfdGFibGUkYWRqLlAuVmFsX0NQRlQzSU9QIDwgMC4wNSYgbWVyZ2VkX3RvcF90YWJsZSRhZGouUC5WYWxfQ1BGIDwgMC4wNSAmIG1lcmdlZF90b3BfdGFibGUkRkNfQ1BGVDNJT1AgPiAwICYgbWVyZ2VkX3RvcF90YWJsZSRGQ19DUEYgPiAwLF0sIHNpemU9MSwgY29sb3I9Im9yY2hpZCIsIGFscGhhPTAuMykgKw0KZ2VvbV9wb2ludChkYXRhPW1lcmdlZF90b3BfdGFibGVbbWVyZ2VkX3RvcF90YWJsZSRhZGouUC5WYWxfQ1BGVDNJT1AgPCAwLjA1JiBtZXJnZWRfdG9wX3RhYmxlJGFkai5QLlZhbF9DUEYgPCAwLjA1ICYgbWVyZ2VkX3RvcF90YWJsZSRGQ19DUEZUM0lPUCA8IDAgJiBtZXJnZWRfdG9wX3RhYmxlJEZDX0NQRiA8IDAsXSwgc2l6ZT0xLCBjb2xvcj0ib3JjaGlkIiwgYWxwaGE9MC4zKSArDQpnZW9tX3BvaW50KGRhdGE9bWVyZ2VkX3RvcF90YWJsZVttZXJnZWRfdG9wX3RhYmxlJGFkai5QLlZhbF9DUEZUM0lPUCA8IDAuMDUmIG1lcmdlZF90b3BfdGFibGUkYWRqLlAuVmFsX0NQRiA8IDAuMDUgJiBhYnMobWVyZ2VkX3RvcF90YWJsZSRGQ19DUEZUM0lPUCkgPCAxKmFicyhtZXJnZWRfdG9wX3RhYmxlJEZDX0NQRiksXSwgc2l6ZT0xLCBjb2xvcj0ibGlnaHRza3libHVlIiwgYWxwaGE9MSkgKw0KZ2VvbV9wb2ludChkYXRhPW1lcmdlZF90b3BfdGFibGVbbWVyZ2VkX3RvcF90YWJsZSRhZGouUC5WYWxfQ1BGVDNJT1AgPCAwLjA1JiBtZXJnZWRfdG9wX3RhYmxlJGFkai5QLlZhbF9DUEYgPCAwLjA1ICYgbWVyZ2VkX3RvcF90YWJsZSRGQ19DUEZUM0lPUCA8IDAgJiBtZXJnZWRfdG9wX3RhYmxlJEZDX0NQRiA+IDAsXSwgc2l6ZT0xLCBjb2xvcj0iZG9kZ2VyYmx1ZSIsIGFscGhhPTEpICsNCmdlb21fcG9pbnQoZGF0YT1tZXJnZWRfdG9wX3RhYmxlW21lcmdlZF90b3BfdGFibGUkYWRqLlAuVmFsX0NQRlQzSU9QIDwgMC4wNSYgbWVyZ2VkX3RvcF90YWJsZSRhZGouUC5WYWxfQ1BGIDwgMC4wNSAmIG1lcmdlZF90b3BfdGFibGUkRkNfQ1BGVDNJT1AgPiAwICYgbWVyZ2VkX3RvcF90YWJsZSRGQ19DUEYgPCAwLF0sIHNpemU9MSwgY29sb3I9ImRvZGdlcmJsdWUiLCBhbHBoYT0xKSArDQogIHhsaW0oLTExLDExKSsNCiAgeWxpbSgtMTEsMTEpKw0KICB5bGFiKCc8c3BhbiBzdHlsZSA9ICJjb2xvcjpncmF5NjAiPkhpZ2hlciBpbiBETVNPPC08L3NwYW4+IGxvZzIoQ1BGVDNJT1AvRE1TTyBGb2xkIENoYW5nZSkgPHNwYW4gc3R5bGUgPSAiY29sb3I6Z3JheTYwIj4tPiBIaWdoZXIgaW4gQ1BGVDNJT1A8L3NwYW4+JykrDQogIHhsYWIoJzxzcGFuIHN0eWxlID0gImNvbG9yOmdyYXk2MCI+SGlnaGVyIGluIERNU08gPC08L3NwYW4+IGxvZzIoQ1BGL0RNU08gRm9sZCBDaGFuZ2UpIDxzcGFuIHN0eWxlID0gImNvbG9yOmdyYXk2MCI+LT4gSGlnaGVyIGluIENQRjwvc3Bhbj4nKSsgDQogIGdlb21faGxpbmUoeWludGVyY2VwdD0xLCBjb2xvciA9ICJncmF5ODUiLCBsaW5ld2lkdGg9MC4xKSsgIyBjYW4gYWRkIGxpbmV0eXBlPSJkYXNoZWQiDQogIGdlb21faGxpbmUoeWludGVyY2VwdD0tMSwgY29sb3IgPSAiZ3JheTg1IiwgbGluZXdpZHRoPTAuMSkrDQogIGdlb21fdmxpbmUoeGludGVyY2VwdD0xLCBjb2xvciA9ICJncmF5ODUiLCBsaW5ld2lkdGg9MC4xKSsNCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0PS0xLCBjb2xvciA9ICJncmF5ODUiLCBsaW5ld2lkdGg9MC4xKSsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0PTAsIGNvbG9yID0gImdyYXk0MCIsIHNpemU9MC4xKSsgDQogIGdlb21fdmxpbmUoeGludGVyY2VwdD0wLCBjb2xvciA9ICJncmF5NDAiLCBzaXplPTAuMSkrDQogIGdndGl0bGUoJ0RpZmZlcmVudGlhbGx5IGV4cHJlc3NlZCBnZW5lcyBpbiAqKkNQRitUM0lPUCoqIHZzICoqQ1BGKionKSsNCiAgbGFicyhzdWJ0aXRsZSA9ICc8c3BhbiBzdHlsZSA9ICJjb2xvcjpvcmNoaWQiPmNoYW5nZSBpbiBzYW1lIGRpcmVjdGlvbjwvc3Bhbj4sDQogICAgICAgPHNwYW4gc3R5bGUgPSAiY29sb3I6c2FuZHlicm93biI+Y2hhbmdlIGluIG9wcG9zaXRlIGRpcmVjdGlvbjwvc3Bhbj4nKSsNCiAgdGhlbWVfYncoKSt0aGVtZShwbG90LnRpdGxlID0gZ2d0ZXh0OjplbGVtZW50X21hcmtkb3duKCksDQogICAgICAgICAgICAgICAgICAgcGxvdC5zdWJ0aXRsZSA9IGdndGV4dDo6ZWxlbWVudF9tYXJrZG93bigpLA0KICAgICAgICAgICAgICAgICAgIGF4aXMudGl0bGUueCA9IGdndGV4dDo6ZWxlbWVudF9tYXJrZG93bigpLA0KICAgICAgICAgICAgICAgICAgIGF4aXMudGl0bGUueSA9IGdndGV4dDo6ZWxlbWVudF9tYXJrZG93bigpLA0KICAgICAgICAgICAgICAgICAgIHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2JsYW5rKCksIHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCkpKw0KICBnZW9tX2FibGluZShpbnRlcmNlcHQgPSAwLCBzbG9wZSA9IDEsIGxpbmV0eXBlPSJkYXNoZWQiKSsNCiAgI2dlb21fYWJsaW5lKGludGVyY2VwdCA9IDAsIHNsb3BlID0gMC43LCBsaW5ldHlwZT0iZGFzaGVkIikrDQogIE5VTEwNCg0KcGxvdDENCg0KDQoNCmBgYA0KDQpgYGB7cixmaWcuaGVpZ2h0PTUsIGZpZy53aWR0aD02LCBlY2hvPUZBTFNFfQ0KDQpwbG90MSArIGdlb21fcG9pbnQoZGF0YT1tZXJnZWRfdG9wX3RhYmxlW21lcmdlZF90b3BfdGFibGUkZW50cmV6X0lEICVpbiUgc2VsZWN0ZWRfZ2VuZXMsXSwgc2l6ZT0yLCBjb2xvcj0ibGlnaHRjb3JhbCIsIGFscGhhPTEpIA0KDQpgYGANCkFsbHV2aWFsIHBsb3QNCg0KYGBge3IsIGVjaG89RkFMU0V9DQojcHJlcGFyZSB0YWJsZSBmb3IgYWxsdXZpYWwgcGxvdA0KYWxsdXZpYWxfZGYgPC0gbWVyZ2VkX3RvcF90YWJsZQ0KDQojZGltKGFsbHV2aWFsX2RmWygoYWxsdXZpYWxfZGYkYWRqLlAuVmFsX0NQRiA8PSAwLjA1KSAmIGFsbHV2aWFsX2RmJGxvZ0ZDX0NQRiA+PSAxKSB8ICgoYWxsdXZpYWxfZGYkYWRqLlAuVmFsX0NQRiA8PSAwLjA1KSAmIGFsbHV2aWFsX2RmJGxvZ0ZDX0NQRiA8IC0xKSxdKQ0KDQphbGx1dmlhbF9kZiA8LSBhbGx1dmlhbF9kZlthbGx1dmlhbF9kZiRhZGouUC5WYWxfQ1BGIDwgMC4wNSxdDQphbGx1dmlhbF9kZiRERV9DUEZbYWxsdXZpYWxfZGYkbG9nRkNfQ1BGID49IDEgfCBhbGx1dmlhbF9kZiRsb2dGQ19DUEYgPCAtMV0gPC0gIkRFIg0KYWxsdXZpYWxfZGYgPC0gYWxsdXZpYWxfZGZbIWlzLm5hKGFsbHV2aWFsX2RmJERFX0NQRiksXQ0KDQoNCiNhbGx1dmlhbF9kZiRERV9DUEYgPC0gIm5vIg0KYWxsdXZpYWxfZGYkREVfQ1BGW2FsbHV2aWFsX2RmJGxvZ0ZDX0NQRiA+PSAxXSA8LSAiMS51cHJlZ3VsYXRlZCINCmFsbHV2aWFsX2RmJERFX0NQRlthbGx1dmlhbF9kZiRsb2dGQ19DUEYgPD0gLTFdIDwtICIyLmRvd25yZWd1bGF0ZWQiDQoNCmFsbHV2aWFsX2RmJGRpcmVjdGlvbiA8LSAiMS5zYW1lIg0KYWxsdXZpYWxfZGYkZGlyZWN0aW9uW3NpZ24oYWxsdXZpYWxfZGYkRkNfQ1BGKSAhPSBzaWduKGFsbHV2aWFsX2RmJEZDX0NQRlQzSU9QKV0gPC0gIjIub3Bwb3NpdGUiDQoNCmFsbHV2aWFsX2RmJG1hZ25pdHV0ZGVfb2ZfY2hhbmdlIDwtICIxLmluY3JlYXNlZCINCmFsbHV2aWFsX2RmJG1hZ25pdHV0ZGVfb2ZfY2hhbmdlW2FicyhhbGx1dmlhbF9kZiRGQ19DUEZUM0lPUCkgPCBhYnMoYWxsdXZpYWxfZGYkRkNfQ1BGKV0gPC0gIjIuYXR0ZW51YXRlZCINCmFsbHV2aWFsX2RmJG1hZ25pdHV0ZGVfb2ZfY2hhbmdlW2FsbHV2aWFsX2RmJGRpcmVjdGlvbiA9PSAiMi5vcHBvc2l0ZSJdIDwtICIzLnJldmVyc2VkIg0KDQpgYGANCg0KDQpgYGB7ciwgd2FybmluZz1GQUxTRSwgZWNobz1GQUxTRX0NCiNwbG90IGFsbHV2aWFsIHBsb3QNCmxpYnJhcnkoZ2dhbGx1dmlhbCkNCg0KDQojcGFsZXR0ZV9QZHVtIDwtIGMoInBhbGVncmVlbjQiLCJwYWxlZ3JlZW4zIiwicGFsZWdyZWVuMiIsICAibGlnaHRjb3JhbCIsICJsaWdodHBpbmsiLCJtaXN0eXJvc2UiLCAiZG9kZ2VyYmx1ZTMiLCJsaWdodHNreWJsdWUiLCAibGlnaHRza3libHVlMSIsICJsaWdodHNreWJsdWUyIikNCg0KZ2dwbG90KGFsbHV2aWFsX2RmLA0KICAgICAgIGFlcyhheGlzMSA9IGFzLmZhY3RvcihERV9DUEYpICwNCiAgICAgICAgICAgI2F4aXMyID0gYXMuZmFjdG9yKGRpcmVjdGlvbiksIA0KICAgICAgICAgICBheGlzMiA9IGFzLmZhY3RvcihtYWduaXR1dGRlX29mX2NoYW5nZSkpKSArDQogICNnZW9tX3N0cmF0dW0od2lkdGggPSAxLzEyLCBmaWxsID0gaHVlX3BhbCgpKDExKSwgY29sb3IgPSAiZ3JleSIpICsNCiAgZ2VvbV9zdHJhdHVtKHdpZHRoID0gMS8xMiwgZmlsbCA9IGMoImxpZ2h0Y29yYWwiLCAiZm9yZXN0Z3JlZW4iLCAiZG9kZ2VyYmx1ZSIsICJsaWdodHNreWJsdWUiLCAib3JjaGlkIiksIGNvbG9yID0gImJsYWNrIikgKw0KICBnZW9tX2xhYmVsKHN0YXQgPSAic3RyYXR1bSIsIGFlcyhsYWJlbCA9IGFmdGVyX3N0YXQoc3RyYXR1bSkpLCBhZXMuYmluZCA9IFRSVUUpICsNCiAgZ2VvbV9mbG93KGFlcyhmaWxsID0gZmFjdG9yKG1hZ25pdHV0ZGVfb2ZfY2hhbmdlKSkpKw0KICBzY2FsZV94X2Rpc2NyZXRlKGxpbWl0cyA9IGMoIkNQRl9ERSIsIk1hZ25pdHV0ZV9vZl9jaGFuZ2UiKSwgZXhwYW5kID0gYyguMDUsIC4wNSkpICsNCiAgI3NjYWxlX2ZpbGxfYnJld2VyKHR5cGUgPSAicXVhbCIsIHBhbGV0dGUgPSAiU2V0MSIpICsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygib3JjaGlkIiwgImxpZ2h0c2t5Ymx1ZSIsICJkb2RnZXJibHVlIikpKw0KICBnZ3RpdGxlKCJFZmZlY3RzIG9mIFQzSU9QLWRkaXRpb24gdG8gQ1BGIikrDQogIHRoZW1lX2J3KCkrdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSsNCiAgdGhlbWUoI3BhbmVsLmJvcmRlciA9IGVsZW1lbnRfcmVjdChjb2xvcj0ibGlnaHRza3libHVlIiwgZmlsbD1OQSwgbGluZXdpZHRoPSAyKSwNCiAgICAgICAgICAgICAgICAgICBwbG90LnRpdGxlID0gZ2d0ZXh0OjplbGVtZW50X21hcmtkb3duKCksDQogICAgICAgICAgICAgICAgICAgcGxvdC5zdWJ0aXRsZSA9IGdndGV4dDo6ZWxlbWVudF9tYXJrZG93bigpKSsNCiAgTlVMTA0KDQoNCg0KYGBgDQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KYWxsdXZpYWxfZGZbYWxsdXZpYWxfZGYkREVfQ1BGID09ICJ1cHJlZ3VsYXRlZCIgJiBhbGx1dmlhbF9kZiRkaXJlY3Rpb24gPT0gIm9wcG9zaXRlIixdDQphbGx1dmlhbF9kZlthbGx1dmlhbF9kZiRERV9DUEYgPT0gIjIuZG93bnJlZ3VsYXRlZCIgJiBhbGx1dmlhbF9kZiRkaXJlY3Rpb24gPT0gIjIub3Bwb3NpdGUiLF0NCmBgYA0KDQoNCmBgYHtyLGZpZy5oZWlnaHQ9NSwgZmlnLndpZHRoPTYsIGVjaG89RkFMU0V9DQpwbG90MQ0KcGxvdDEgKyBnZW9tX3BvaW50KGRhdGE9bWVyZ2VkX3RvcF90YWJsZVttZXJnZWRfdG9wX3RhYmxlJE1QSV9zdGF0dXMgPT0gIlVQIixdLCBzaXplPTEsIGNvbG9yPSJsaWdodGNvcmFsIiwgYWxwaGE9MSkgDQpwbG90MSArIGdlb21fcG9pbnQoZGF0YT1tZXJnZWRfdG9wX3RhYmxlW21lcmdlZF90b3BfdGFibGUkTVBJX3N0YXR1cyA9PSAiRE9XTiIsXSwgc2l6ZT0xLCBjb2xvcj0ibGlnaHRjb3JhbCIsIGFscGhhPTEpIA0KYGBgDQoNCg0KYGBge3IsIGVjaG89RkFMU0V9DQojbGlzdCBnZW5lcyBkb3ducmVndWxhdGVkIGJ5IENQRlQzSU9QLCBidXQgdXByZWd1bGF0ZWQgYnkgQ1BGLCB0b3BsZWZ0DQphY3RpdmF0ZWQgPC0gbWVyZ2VkX3RvcF90YWJsZVttZXJnZWRfdG9wX3RhYmxlJGFkai5QLlZhbF9DUEYgPCAwLjA1ICYgbWVyZ2VkX3RvcF90YWJsZSRsb2dGQ19DUEYgPiAxICYgbWVyZ2VkX3RvcF90YWJsZSRhZGouUC5WYWxfQ1BGVDNJT1AgPCAwLjA1ICYgbWVyZ2VkX3RvcF90YWJsZSRsb2dGQ19DUEZUM0lPUCA8IC0xLF0NCiNjcmVhdGUgYSBnbG9iYWwgcmFua2luZyBtZXRob2QNCmFjdGl2YXRlZCA8LSBhY3RpdmF0ZWRbb3JkZXIoYWJzKGFjdGl2YXRlZCRGQ19DUEZUM0lPUCksIGRlY3JlYXNpbmcgPSBUUlVFKSxdDQphY3RpdmF0ZWQkcmFua19DUEZUM0lPUCA8LSBzZXEoMTpucm93KGFjdGl2YXRlZCkpDQphY3RpdmF0ZWQgPC0gYWN0aXZhdGVkW29yZGVyKGFicyhhY3RpdmF0ZWQkRkNfQ1BGKSwgZGVjcmVhc2luZyA9IFRSVUUpLF0NCmFjdGl2YXRlZCRyYW5rX0NQRiA8LSBzZXEoMTpucm93KGFjdGl2YXRlZCkpDQphY3RpdmF0ZWQkcmFuayA8LSBhY3RpdmF0ZWQkcmFua19DUEZUM0lPUCthY3RpdmF0ZWQkcmFua19DUEYNCmFjdGl2YXRlZCA8LSBhY3RpdmF0ZWRbb3JkZXIoYWN0aXZhdGVkJHJhbmspLF0NCmFjdGl2YXRlZCA8LSBhY3RpdmF0ZWRbLGMoImVudHJlel9JRCIsICJlbnNlbWJsX0lEX0NQRlQzSU9QIiwibWVyZ2VkX3N5bWJvbF9DUEZUM0lPUCIsICJtZXJnZWRfZGVzY3JpcHRpb25fQ1BGVDNJT1AiLCAibG9nRkNfQ1BGVDNJT1AiLCAibG9nRkNfQ1BGIiwgIkZDX0NQRlQzSU9QIiwgIkZDX0NQRiIsICJyYW5rIildDQoNCmthYmxlKGFjdGl2YXRlZCwgY2FwdGlvbiA9ICJEaWZmZXJlbnRpYWxseSBFeHByZXNzZWQgZ2VuZXMgKHAgPCAwLjUsIEZDPjIgb3IgRkM8MS8yKSBkb3ducmVndWxhdGVkIGJ5IENQRlQzSU9QIGJ1dCB1cHJlZ3VsYXRlZCBieSBDUEYiKQ0KDQojbGlzdCBnZW5lcyB1cHJlZ3VsYXRlZCBieSBDUEZUM0lPUCwgYnV0IGRvd25yZWd1bGF0ZWQgYnkgQ1BGLCBib3R0b21yaWdodA0KcmVwcmVzc2VkIDwtIG1lcmdlZF90b3BfdGFibGVbbWVyZ2VkX3RvcF90YWJsZSRhZGouUC5WYWxfQ1BGIDwgMC4wNSAmIG1lcmdlZF90b3BfdGFibGUkbG9nRkNfQ1BGIDwgLTEgJiBtZXJnZWRfdG9wX3RhYmxlJGFkai5QLlZhbF9DUEZUM0lPUCA8IDAuMDUgJiBtZXJnZWRfdG9wX3RhYmxlJGxvZ0ZDX0NQRlQzSU9QID4gMSxdDQojY3JlYXRlIGEgZ2xvYmFsIHJhbmtpbmcgbWV0aG9kDQpyZXByZXNzZWQgPC0gcmVwcmVzc2VkW29yZGVyKGFicyhyZXByZXNzZWQkRkNfQ1BGVDNJT1ApLCBkZWNyZWFzaW5nID0gVFJVRSksXQ0KcmVwcmVzc2VkJHJhbmtfQ1BGVDNJT1AgPC0gc2VxKDE6bnJvdyhyZXByZXNzZWQpKQ0KcmVwcmVzc2VkIDwtIHJlcHJlc3NlZFtvcmRlcihhYnMocmVwcmVzc2VkJEZDX0NQRiksIGRlY3JlYXNpbmcgPSBUUlVFKSxdDQpyZXByZXNzZWQkcmFua19DUEYgPC0gc2VxKDE6bnJvdyhyZXByZXNzZWQpKQ0KcmVwcmVzc2VkJHJhbmsgPC0gcmVwcmVzc2VkJHJhbmtfQ1BGVDNJT1ArcmVwcmVzc2VkJHJhbmtfQ1BGDQpyZXByZXNzZWQgPC0gcmVwcmVzc2VkW29yZGVyKHJlcHJlc3NlZCRyYW5rKSxdDQpyZXByZXNzZWQgPC0gcmVwcmVzc2VkWyxjKCJlbnRyZXpfSUQiLCAiZW5zZW1ibF9JRF9DUEZUM0lPUCIsIm1lcmdlZF9zeW1ib2xfQ1BGVDNJT1AiLCAibWVyZ2VkX2Rlc2NyaXB0aW9uX0NQRlQzSU9QIiwgImxvZ0ZDX0NQRlQzSU9QIiwgImxvZ0ZDX0NQRiIsICJGQ19DUEZUM0lPUCIsICJGQ19DUEYiLCAicmFuayIpXQ0KDQprYWJsZShyZXByZXNzZWQsIGNhcHRpb24gPSAiRGlmZmVyZW50aWFsbHkgRXhwcmVzc2VkIGdlbmVzIChwIDwgMC41LCBGQz4yIG9yIEZDPDEvMikgdXByZWd1bGF0ZWQgYnkgQ1BGVDNJT1AgYnV0IGRvd25yZWd1bGF0ZWQgYnkgQ1BGIikNCg0KI2xpc3Qgc3RyZXNzIGdlbmVzIHVwcmVndWxhdGVkLCB0b3ByaWdodA0KI3VwX2JvdGggPC0gbWVyZ2VkX3RvcF90YWJsZVttZXJnZWRfdG9wX3RhYmxlJGFkai5QLlZhbF9DUEYgPCAwLjA1ICYgbWVyZ2VkX3RvcF90YWJsZSRsb2dGQ19DUEYgPiAxICYgbWVyZ2VkX3RvcF90YWJsZSRhZGouUC5WYWxfVDNJT1AgPCAwLjA1ICYgbWVyZ2VkX3RvcF90YWJsZSRsb2dGQ19UM0lPUCA+MSxdDQojY3JlYXRlIGEgZ2xvYmFsIHJhbmtpbmcgbWV0aG9kDQojdXBfYm90aCA8LSB1cF9ib3RoW29yZGVyKGFicyh1cF9ib3RoJEZDX1QzSU9QKSwgZGVjcmVhc2luZyA9IFRSVUUpLF0NCiN1cF9ib3RoJHJhbmtfVDNJT1AgPC0gc2VxKDE6bnJvdyh1cF9ib3RoKSkNCiN1cF9ib3RoIDwtIHVwX2JvdGhbb3JkZXIoYWJzKHVwX2JvdGgkRkNfQ1BGKSwgZGVjcmVhc2luZyA9IFRSVUUpLF0NCiN1cF9ib3RoJHJhbmtfQ1BGIDwtIHNlcSgxOm5yb3codXBfYm90aCkpDQojdXBfYm90aCRyYW5rIDwtIHVwX2JvdGgkcmFua19UM0lPUCt1cF9ib3RoJHJhbmtfQ1BGDQojdXBfYm90aCA8LSB1cF9ib3RoW29yZGVyKHVwX2JvdGgkcmFuayksXQ0KI3VwX2JvdGggPC0gdXBfYm90aFssYygiZW50cmV6X0lEIiwgImVuc2VtYmxfSURfQ1BGVDNJT1AiLCJtZXJnZWRfc3ltYm9sX0NQRlQzSU9QIiwgIm1lcmdlZF9kZXNjcmlwdGlvbl9DUEZUM0lPUCIsICJsb2dGQ19DUEZUM0lPUCIsICJsb2dGQ19DUEYiLCAiRkNfQ1BGVDNJT1AiLCAiRkNfQ1BGIiwgInJhbmsiKV0NCg0KI2thYmxlKHVwX2JvdGgsIGNhcHRpb24gPSAiRGlmZmVyZW50aWFsbHkgRXhwcmVzc2VkIGdlbmVzIChwIDwgMC41LCBGQz4yIG9yIEZDPDEvMikgYWN0aXZhdGVkIGJ5IENQRiBhbmQgVDNJT1AiKQ0KDQojbGlzdCBzdHJlc3MgZ2VuZXMgZG93bnJlZ3VsYXRlZCwgYm90dG9tbGVmdA0KI2Rvd25fYm90aCA8LSBtZXJnZWRfdG9wX3RhYmxlW21lcmdlZF90b3BfdGFibGUkYWRqLlAuVmFsX0NQRiA8IDAuMDUgJiBtZXJnZWRfdG9wX3RhYmxlJGxvZ0ZDX0NQRiA8IC0xICYgbWVyZ2VkX3RvcF90YWJsZSRhZGouUC5WYWxfVDNJT1AgPCAwLjA1ICYgbWVyZ2VkX3RvcF90YWJsZSRsb2dGQ19UM0lPUCA8IC0xLF0NCiNjcmVhdGUgYSBnbG9iYWwgcmFua2luZyBtZXRob2QNCiNkb3duX2JvdGggPC0gZG93bl9ib3RoW29yZGVyKGFicyhkb3duX2JvdGgkRkNfVDNJT1ApLCBkZWNyZWFzaW5nID0gVFJVRSksXQ0KI2Rvd25fYm90aCRyYW5rX1QzSU9QIDwtIHNlcSgxOm5yb3coZG93bl9ib3RoKSkNCiNkb3duX2JvdGggPC0gZG93bl9ib3RoW29yZGVyKGFicyhkb3duX2JvdGgkRkNfQ1BGKSwgZGVjcmVhc2luZyA9IFRSVUUpLF0NCiNkb3duX2JvdGgkcmFua19DUEYgPC0gc2VxKDE6bnJvdyhkb3duX2JvdGgpKQ0KI2Rvd25fYm90aCRyYW5rIDwtIGRvd25fYm90aCRyYW5rX1QzSU9QK2Rvd25fYm90aCRyYW5rX0NQRg0KI2Rvd25fYm90aCA8LSBkb3duX2JvdGhbb3JkZXIoZG93bl9ib3RoJHJhbmspLF0NCiNkb3duX2JvdGggPC0gZG93bl9ib3RoWyxjKCJlbnRyZXpfSUQiLCAiZW5zZW1ibF9JRF9DUEZUM0lPUCIsIm1lcmdlZF9zeW1ib2xfQ1BGVDNJT1AiLCAibWVyZ2VkX2Rlc2NyaXB0aW9uX0NQRlQzSU9QIiwgImxvZ0ZDX0NQRlQzSU9QIiwgImxvZ0ZDX0NQRiIsICJGQ19DUEZUM0lPUCIsICJGQ19DUEYiLCAicmFuayIpXQ0KDQoja2FibGUoZG93bl9ib3RoLCBjYXB0aW9uID0gIkRpZmZlcmVudGlhbGx5IEV4cHJlc3NlZCBnZW5lcyAocCA8IDAuNSwgRkM+MiBvciBGQzwxLzIpIGRvd25yZWd1bGF0ZWQgYnkgQ1BGIGFuZCBUM0lPUCIpDQoNCiNyZW1vdmUgdW51c2VkIHZhcmlhYmxlcw0KI3JtKGFjdGl2YXRlZCwgcmVwcmVzc2VkLCB1cF9ib3RoLCBkb3duX2JvdGgpDQpgYGANCg0KDQpgYGB7ciwgZWNobz1GQUxTRSwgaW5jbHVkZT1GQUxTRX0NCiNsaXN0IGdlbmVzIGRvd25yZWd1bGF0ZWQgb3IgdXByZWd1bGF0ZWQgYnkgTVBJLCBidXQgdW5hZmZlY3RlZCBieSBDUEYNClQzSU9QX29ubHkgPC0gbWVyZ2VkX3RvcF90YWJsZVttZXJnZWRfdG9wX3RhYmxlJGFkai5QLlZhbF9UM0lPUCA8IDAuMDUmIGFicyhtZXJnZWRfdG9wX3RhYmxlJGxvZ0ZDX1QzSU9QKSA+IDEgJiBhYnMobWVyZ2VkX3RvcF90YWJsZSRsb2dGQ19DUEYpIDwgMSxdDQojY3JlYXRlIGEgZ2xvYmFsIHJhbmtpbmcgbWV0aG9kDQpUM0lPUF9vbmx5IDwtIFQzSU9QX29ubHlbb3JkZXIoYWJzKFQzSU9QX29ubHkkRkNfVDNJT1ApLCBkZWNyZWFzaW5nID0gVFJVRSksXQ0KVDNJT1Bfb25seSRyYW5rX1QzSU9QIDwtIHNlcSgxOm5yb3coVDNJT1Bfb25seSkpDQpUM0lPUF9vbmx5IDwtIFQzSU9QX29ubHlbb3JkZXIoYWJzKFQzSU9QX29ubHkkRkNfQ1BGKSwgZGVjcmVhc2luZyA9IFRSVUUpLF0NClQzSU9QX29ubHkkcmFua19DUEYgPC0gc2VxKDE6bnJvdyhUM0lPUF9vbmx5KSkNClQzSU9QX29ubHkkcmFuayA8LSBUM0lPUF9vbmx5JHJhbmtfVDNJT1ArVDNJT1Bfb25seSRyYW5rX0NQRg0KVDNJT1Bfb25seSA8LSBUM0lPUF9vbmx5W29yZGVyKFQzSU9QX29ubHkkcmFuayksXQ0KVDNJT1Bfb25seSA8LSBUM0lPUF9vbmx5WyxjKCJlbnRyZXpfSUQiLCAiZW5zZW1ibF9JRF9UM0lPUCIsIm1lcmdlZF9zeW1ib2xfVDNJT1AiLCAibWVyZ2VkX2Rlc2NyaXB0aW9uX1QzSU9QIiwgImxvZ0ZDX1QzSU9QIiwgImxvZ0ZDX0NQRiIsICJGQ19UM0lPUCIsICJGQ19DUEYiLCAicmFuayIpXQ0KDQoNCiNsaXN0IGdlbmVzIGRvd25yZWd1bGF0ZWQgb3IgdXByZWd1bGF0ZWQgYnkgQ1BGLCBidXQgdW5hZmZlY3RlZCBieSBNUEkNCkNQRl9vbmx5IDwtIG1lcmdlZF90b3BfdGFibGVbbWVyZ2VkX3RvcF90YWJsZSRhZGouUC5WYWxfQ1BGIDwgMC4wNSYgYWJzKG1lcmdlZF90b3BfdGFibGUkbG9nRkNfQ1BGKSA+IDEgJiBhYnMobWVyZ2VkX3RvcF90YWJsZSRsb2dGQ19UM0lPUCkgPCAxLF0NCiNjcmVhdGUgYSBnbG9iYWwgcmFua2luZyBtZXRob2QNCkNQRl9vbmx5IDwtIENQRl9vbmx5W29yZGVyKGFicyhDUEZfb25seSRGQ19UM0lPUCksIGRlY3JlYXNpbmcgPSBUUlVFKSxdDQpDUEZfb25seSRyYW5rX1QzSU9QIDwtIHNlcSgxOm5yb3coQ1BGX29ubHkpKQ0KQ1BGX29ubHkgPC0gQ1BGX29ubHlbb3JkZXIoYWJzKENQRl9vbmx5JEZDX0NQRiksIGRlY3JlYXNpbmcgPSBUUlVFKSxdDQpDUEZfb25seSRyYW5rX0NQRiA8LSBzZXEoMTpucm93KENQRl9vbmx5KSkNCkNQRl9vbmx5JHJhbmsgPC0gQ1BGX29ubHkkcmFua19UM0lPUCtDUEZfb25seSRyYW5rX0NQRg0KQ1BGX29ubHkgPC0gQ1BGX29ubHlbb3JkZXIoQ1BGX29ubHkkcmFuayksXQ0KQ1BGX29ubHkgPC0gQ1BGX29ubHlbLGMoImVudHJlel9JRCIsICJlbnNlbWJsX0lEX1QzSU9QIiwibWVyZ2VkX3N5bWJvbF9UM0lPUCIsICJtZXJnZWRfZGVzY3JpcHRpb25fVDNJT1AiLCAibG9nRkNfVDNJT1AiLCAibG9nRkNfQ1BGIiwgIkZDX1QzSU9QIiwgIkZDX0NQRiIsICJyYW5rIildDQpgYGANCg0KDQpgYGB7ciwgZWNobz1GQUxTRX0NCiNMZXQgdXMgcHJpbnQgYSBzdW1tYXJ5IHJlcHJlc2VudGF0aW9uIG9mIHRoZSBkaWZmZXJlbnRpYWxseSBleHByZXNzZWQgZ2VuZXMNCnBhc3RlMChkaW0odXBfYm90aClbMV0gLCIgIGRpZmZlcmVudGlhbGx5IGV4cHJlc3NlZCBnZW5lcyB1cHJlZ3VsYXRlZCBieSBib3RoIENQRiBhbmQgVDNJT1AiKQ0KcGFzdGUwKGRpbShkb3duX2JvdGgpWzFdICwiICBkaWZmZXJlbnRpYWxseSBleHByZXNzZWQgZ2VuZXMgZG93bnJlZ3VsYXRlZCBieSBib3RoIENQRiBhbmQgVDNJT1AiKQ0KcGFzdGUwKGRpbShhY3RpdmF0ZWQpWzFdLCIgZGlmZmVyZW50aWFsbHkgZXhwcmVzc2VkIGdlbmVzIGRvd25yZWd1bGF0ZWQgYnkgVDNJT1AgYnV0IHVwcmVndWxhdGVkIGJ5IENQRiIpDQpwYXN0ZTAoZGltKHJlcHJlc3NlZClbMV0gLCIgZGlmZmVyZW50aWFsbHkgZXhwcmVzc2VkIGdlbmVzIHVwcmVndWxhdGVkIGJ5IFQzSU9QIGJ1dCBkb3ducmVlZ3VsYXRlZCBieSBDUEYiKQ0KDQojaW4gdGhpcyBjYXNlLCBpdCBpcyBhbHNvIGludGVyZXN0aW5nIHRvIGxpc3QgZ2VuZXMgdGhhdCBhcmUgdXByZWd1bGF0ZWQgYnkgQ1BGIGJ1dCBhcmUgbm90IGFmZmVjdGVkIChkbyBub3Qgc2lnbmlmaWNhbnRseSBjaGFuZ2UpIHVuZGVyIFQzSU9QOyBhbmQgdmljZXZlcnNhDQpwYXN0ZTAoZGltKFQzSU9QX29ubHkpWzFdICwiICBkaWZmZXJlbnRpYWxseSBleHByZXNzZWQgZ2VuZXMgdW5kZXIgVDNJT1AsIHVuYWZmZWN0ZWQgYnkgQ1BGIikNCnBhc3RlMChkaW0oQ1BGX29ubHkpWzFdICwiICBkaWZmZXJlbnRpYWxseSBleHByZXNzZWQgZ2VuZXMgdW5kZXIgQ1BGLCB1bmFmZmVjdGVkIGJ5IFQzSU9QIikNCmBgYA0KDQpgYGB7ciwgZWNobz1GQUxTRX0NCiNsZXQgdXMgc2F2ZSBsaXN0cyBvZiB0aGVzZSBnZW5lcyBmb3IgZGVkaWNhdGVkIGFuYWx5c2lzDQp3cml0ZS5jc3YodXBfYm90aCwiRDovL0FvY2VsbGFyaXNfQ1BGX01QSV9UMy9TYXZlZF9vYmplY3RzL3VwcmVndWxhdGVkX0NQRmFuZFQzSU9QLmNzdiIscm93Lm5hbWVzID0gRkFMU0UpDQp3cml0ZS5jc3YoZG93bl9ib3RoLCJEOi8vQW9jZWxsYXJpc19DUEZfTVBJX1QzL1NhdmVkX29iamVjdHMvZG93bnJlZ3VsYXRlZF9DUEZhbmRUM0lPUC5jc3YiLHJvdy5uYW1lcyA9IEZBTFNFKQ0Kd3JpdGUuY3N2KE1QSV9vbmx5LCJEOi8vQW9jZWxsYXJpc19DUEZfTVBJX1QzL1NhdmVkX29iamVjdHMvcmVndWxhdGVkX2J5X1QzSU9Qbm90Q1BGLmNzdiIscm93Lm5hbWVzID0gRkFMU0UpDQp3cml0ZS5jc3YoQ1BGX29ubHksIkQ6Ly9Bb2NlbGxhcmlzX0NQRl9NUElfVDMvU2F2ZWRfb2JqZWN0cy9yZWd1bGF0ZWRfYnlfQ1BGbm90VDNJT1AuY3N2Iixyb3cubmFtZXMgPSBGQUxTRSkNCndyaXRlLmNzdihhY3RpdmF0ZWQsIkQ6Ly9Bb2NlbGxhcmlzX0NQRl9NUElfVDMvU2F2ZWRfb2JqZWN0cy91cENQRl9kb3duVDNJT1AuY3N2Iixyb3cubmFtZXMgPSBGQUxTRSkNCndyaXRlLmNzdihyZXByZXNzZWQsIkQ6Ly9Bb2NlbGxhcmlzX0NQRl9NUElfVDMvU2F2ZWRfb2JqZWN0cy91cFQzSU9QX2Rvd25DUEYuY3N2Iixyb3cubmFtZXMgPSBGQUxTRSkNCmBgYA0KDQpgYGB7ciwgZWNobz1GQUxTRX0NCiN0byB1c2UgdGhpcyBhcyBhIHJlZmVyZW5jZSBmb3IgdGhlIGdlbmVzIHNpZ25sZWQgb3V0IGZybSB0aGUgdmVubiBkaWFncmFtLCBzYXZlIGFzIG9iamVjdCwNCmFjdGl2YXRlZF9DUEZfVDNJT1AgPC0gYWN0aXZhdGVkDQptZXJnZWRfdG9wX3RhYmxlX0NQRl9UM0lPUCA8LSBtZXJnZWRfdG9wX3RhYmxlDQpzYXZlKG1lcmdlZF90b3BfdGFibGVfQ1BGX1QzSU9QLCBmaWxlID0gIkQ6Ly9Bb2NlbGxhcmlzX0NQRl9NUElfVDMvU2F2ZWRfb2JqZWN0cy9tZXJnZWRfdG9wX3RhYmxlX1QzSU9QX0NQRi5yZHMiKQ0KYGBgDQoNCg0KDQojIyMgQ29tcGFyaW5nIFQzSU9QIGFuZCBDUEYrVDNJT1ANCg0KYGBge3IsIGVjaG89RkFMU0V9DQojIyBMZXQgdXMgaW1wb3J0IHRoZSBUb3BUYWJsZXMgKHRhYmxlcyBvZiBkaWZmZXJlbnRpYWxseSBleHByZXNzZWQgZ2VuZXMpIGZyb20gZWFjaCBkYXRhc2V0DQojbG9hZCBsaXN0IG9mIERFIGdlbmVzIGluIHRoZSBUMytDUEYgdHJlYXRtZW50DQpsb2FkKCJEOi8vQW9jZWxsYXJpc19DUEZfTVBJX1QzL1NhdmVkX29iamVjdHMvZnVsbF90b3BfdGFibGVfQ1BGVDNJT1B2c0RNU08ucmRzIikNCmZ1bGxfdG9wX3RhYmxlX0NQRlQzSU9QdnNETVNPIDwtIGZ1bGxfdG9wX3RhYmxlDQojcmVsb2FkIGxpc3Qgb2YgREUgZ2VuZXMgaW4gdGhlIFQzSU9QIHRyZWF0bWVudA0KbG9hZCgiRDovL0FvY2VsbGFyaXNfQ1BGX01QSV9UMy9TYXZlZF9vYmplY3RzL2Z1bGxfdG9wX3RhYmxlX1QzSU9QdnNETVNPLnJkcyIpDQpmdWxsX3RvcF90YWJsZV9UM0lPUHZzRE1TTyA8LSBmdWxsX3RvcF90YWJsZQ0Kcm0oZnVsbF90b3BfdGFibGUpDQojcHJlcGFyZSBjb21iaW5lZCB0YWJsZQ0KDQpgYGANCg0KDQpgYGB7ciwgZWNobz1GQUxTRX0NCmthYmxlKGZ1bGxfdG9wX3RhYmxlX0NQRlQzSU9QdnNETVNPWzE6MjAsXSwgY2FwdGlvbiA9ICJUb3AyMCBkaWZmZXJlbnRpYWxseSBleHByZXNzZWQgZ2VuZXMgaW4gQ1BGVDNJT1AgdnMgY29udHJvbCAoYWxsIEZDIGFuZCBwdmFsdWVzOyByYW5rZWQgYnkgRkMpIikgI2Zyb20gaG93IHdlIGRlZmluZWQgdGhlIGNvbnRyYXN0cywgYSBwb3NpdGl2ZSBGQyBoZXJlID09IGhpZ2hlciBpbiBNUEkNCmthYmxlKGZ1bGxfdG9wX3RhYmxlX1QzSU9QdnNETVNPWzE6MjAsXSwgY2FwdGlvbiA9ICJUb3AyMCBkaWZmZXJlbnRpYWxseSBleHByZXNzZWQgZ2VuZXMgaW4gQ1BGIHZzIGNvbnRyb2wgKGFsbCBGQyBhbmQgcHZhbHVlczsgcmFua2VkIGJ5IEZDKSIpICNmcm9tIGhvdyB3ZSBkZWZpbmVkIHRoZSBjb250cmFzdHMsIGEgbmVnYXRpdmUgRkMgaGVyZSA9PSBoaWdoZXIgaW4gVDMNCg0KI0luIHRoaXMgY2FzZSwgdGhlIHR3byB0b3B0YWJsZSBjb21lIGZyb20gdGhlIHNhbWUgZGF0YXNldCwgc28gYWxsIGdlbmVzIGluIG9uZSB3aWxsIGFsc28gYmUgcHJlc2VudCBpbiB0aGUgb3RoZXIgb25lLCBhZCB0aGV5IHVuZGVyd2VudCB0aGUgc2FtZSBmaWx0ZXJpbmcuIE5vIG5lZWQgdG8gcmVtb3ZlIGV4Y2VzcyBnZW5lcyBpbiBlaXRoZXIgdGFibGUNCg0KIyNsZXQgdXMgY3JlYXRlIGEgIm1lcmdlZCB0b3B0YWJsZSIgd2hlcmUgZ2VuZXMgaGF2ZSB0aGUgRkMgZm9yIGJvdGggY29udHJhc3RzDQojKG5vdGljZSB0aGF0IG5vdyBib3RoIHRvcHRhYmxlcyBoYXZlIHRoZSBzYW1lIGxlbmd0aCkNCm1lcmdlZF90b3BfdGFibGUgPC0gbWVyZ2UoZnVsbF90b3BfdGFibGVfQ1BGVDNJT1B2c0RNU08sDQogICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bGxfdG9wX3RhYmxlX1QzSU9QdnNETVNPLA0KICAgICAgICAgICAgICAgICAgICAgICAgICBieT0iZW50cmV6X0lEIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgc3VmZml4ZXMgPSBjKCJfQ1BGVDNJT1AiLCJfVDNJT1AiKSkNCg0KI3Nob3cgZmlyc3QgZW50cmllcyBvZiBtZXJnZWQgdG9wdGFibGUNCiNrYWJsZShtZXJnZWRfdG9wX3RhYmxlWzE6MjAsXSkNCmBgYCANCg0KQXR0ZW51YXRpb24gcGxvdA0KDQpgYGB7cixmaWcuaGVpZ2h0PTUsIGZpZy53aWR0aD02LCBlY2hvPUZBTFNFfQ0KI3Bsb3QNCnBsb3QxIDwtIGdncGxvdChtZXJnZWRfdG9wX3RhYmxlLCBhZXMoeT1zaWduKEZDX0NQRlQzSU9QKSpsb2cyKGFicyhGQ19DUEZUM0lPUCkpLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeD1zaWduKEZDX1QzSU9QKSpsb2cyKGFicyhGQ19UM0lPUCkpKSkgKw0KICBnZW9tX3BvaW50KGRhdGE9bWVyZ2VkX3RvcF90YWJsZSwgc2l6ZT0wLjUsIGNvbG9yPSJncmF5NjAiLCBhbHBoYT0wLjEpICsNCmdlb21fcG9pbnQoZGF0YT1tZXJnZWRfdG9wX3RhYmxlW21lcmdlZF90b3BfdGFibGUkYWRqLlAuVmFsX0NQRlQzSU9QIDwgMC4wNSYgbWVyZ2VkX3RvcF90YWJsZSRhZGouUC5WYWxfVDNJT1AgPCAwLjA1ICYgbWVyZ2VkX3RvcF90YWJsZSRGQ19DUEZUM0lPUCA+IDAgJiBtZXJnZWRfdG9wX3RhYmxlJEZDX1QzSU9QID4gMCxdLCBzaXplPTEsIGNvbG9yPSJvcmNoaWQiLCBhbHBoYT0wLjMpICsNCmdlb21fcG9pbnQoZGF0YT1tZXJnZWRfdG9wX3RhYmxlW21lcmdlZF90b3BfdGFibGUkYWRqLlAuVmFsX0NQRlQzSU9QIDwgMC4wNSYgbWVyZ2VkX3RvcF90YWJsZSRhZGouUC5WYWxfVDNJT1AgPCAwLjA1ICYgbWVyZ2VkX3RvcF90YWJsZSRGQ19DUEZUM0lPUCA8IDAgJiBtZXJnZWRfdG9wX3RhYmxlJEZDX1QzSU9QIDwgMCxdLCBzaXplPTEsIGNvbG9yPSJvcmNoaWQiLCBhbHBoYT0wLjMpICsNCmdlb21fcG9pbnQoZGF0YT1tZXJnZWRfdG9wX3RhYmxlW21lcmdlZF90b3BfdGFibGUkYWRqLlAuVmFsX0NQRlQzSU9QIDwgMC4wNSYgbWVyZ2VkX3RvcF90YWJsZSRhZGouUC5WYWxfVDNJT1AgPCAwLjA1ICYgYWJzKG1lcmdlZF90b3BfdGFibGUkRkNfQ1BGVDNJT1ApIDwgMSphYnMobWVyZ2VkX3RvcF90YWJsZSRGQ19UM0lPUCksXSwgc2l6ZT0xLCBjb2xvcj0ibGlnaHRza3libHVlIiwgYWxwaGE9MSkgKw0KZ2VvbV9wb2ludChkYXRhPW1lcmdlZF90b3BfdGFibGVbbWVyZ2VkX3RvcF90YWJsZSRhZGouUC5WYWxfQ1BGVDNJT1AgPCAwLjA1JiBtZXJnZWRfdG9wX3RhYmxlJGFkai5QLlZhbF9UM0lPUCA8IDAuMDUgJiBtZXJnZWRfdG9wX3RhYmxlJEZDX0NQRlQzSU9QIDwgMCAmIG1lcmdlZF90b3BfdGFibGUkRkNfVDNJT1AgPiAwLF0sIHNpemU9MSwgY29sb3I9ImRvZGdlcmJsdWUiLCBhbHBoYT0wLjMpICsNCmdlb21fcG9pbnQoZGF0YT1tZXJnZWRfdG9wX3RhYmxlW21lcmdlZF90b3BfdGFibGUkYWRqLlAuVmFsX0NQRlQzSU9QIDwgMC4wNSYgbWVyZ2VkX3RvcF90YWJsZSRhZGouUC5WYWxfVDNJT1AgPCAwLjA1ICYgbWVyZ2VkX3RvcF90YWJsZSRGQ19DUEZUM0lPUCA+IDAgJiBtZXJnZWRfdG9wX3RhYmxlJEZDX1QzSU9QIDwgMCxdLCBzaXplPTEsIGNvbG9yPSJkb2RnZXJibHVlIiwgYWxwaGE9MC4zKSArDQogIHhsaW0oLTExLDExKSsNCiAgeWxpbSgtMTEsMTEpKw0KICB5bGFiKCc8c3BhbiBzdHlsZSA9ICJjb2xvcjpncmF5NjAiPkhpZ2hlciBpbiBETVNPPC08L3NwYW4+IGxvZzIoQ1BGVDNJT1AvRE1TTyBGb2xkIENoYW5nZSkgPHNwYW4gc3R5bGUgPSAiY29sb3I6Z3JheTYwIj4tPiBIaWdoZXIgaW4gQ1BGVDNJT1A8L3NwYW4+JykrDQogIHhsYWIoJzxzcGFuIHN0eWxlID0gImNvbG9yOmdyYXk2MCI+SGlnaGVyIGluIERNU08gPC08L3NwYW4+IGxvZzIoVDNJT1AvRE1TTyBGb2xkIENoYW5nZSkgPHNwYW4gc3R5bGUgPSAiY29sb3I6Z3JheTYwIj4tPiBIaWdoZXIgaW4gVDNJT1A8L3NwYW4+JykrIA0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQ9MSwgY29sb3IgPSAiZ3JheTg1IiwgbGluZXdpZHRoPTAuMSkrICMgY2FuIGFkZCBsaW5ldHlwZT0iZGFzaGVkIg0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQ9LTEsIGNvbG9yID0gImdyYXk4NSIsIGxpbmV3aWR0aD0wLjEpKw0KICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQ9MSwgY29sb3IgPSAiZ3JheTg1IiwgbGluZXdpZHRoPTAuMSkrDQogIGdlb21fdmxpbmUoeGludGVyY2VwdD0tMSwgY29sb3IgPSAiZ3JheTg1IiwgbGluZXdpZHRoPTAuMSkrDQogIGdlb21faGxpbmUoeWludGVyY2VwdD0wLCBjb2xvciA9ICJncmF5NDAiLCBzaXplPTAuMSkrIA0KICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQ9MCwgY29sb3IgPSAiZ3JheTQwIiwgc2l6ZT0wLjEpKw0KICBnZ3RpdGxlKCdEaWZmZXJlbnRpYWxseSBleHByZXNzZWQgZ2VuZXMgaW4gKipDUEYrVDNJT1AqKiB2cyAqKlQzSU9QKionKSsNCiAgbGFicyhzdWJ0aXRsZSA9ICc8c3BhbiBzdHlsZSA9ICJjb2xvcjpvcmNoaWQiPmNoYW5nZSBpbiBzYW1lIGRpcmVjdGlvbjwvc3Bhbj4sDQogICAgICAgPHNwYW4gc3R5bGUgPSAiY29sb3I6c2FuZHlicm93biI+Y2hhbmdlIGluIG9wcG9zaXRlIGRpcmVjdGlvbjwvc3Bhbj4nKSsNCiAgdGhlbWVfYncoKSt0aGVtZShwbG90LnRpdGxlID0gZ2d0ZXh0OjplbGVtZW50X21hcmtkb3duKCksDQogICAgICAgICAgICAgICAgICAgcGxvdC5zdWJ0aXRsZSA9IGdndGV4dDo6ZWxlbWVudF9tYXJrZG93bigpLA0KICAgICAgICAgICAgICAgICAgIGF4aXMudGl0bGUueCA9IGdndGV4dDo6ZWxlbWVudF9tYXJrZG93bigpLA0KICAgICAgICAgICAgICAgICAgIGF4aXMudGl0bGUueSA9IGdndGV4dDo6ZWxlbWVudF9tYXJrZG93bigpLA0KICAgICAgICAgICAgICAgICAgIHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2JsYW5rKCksIHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCkpKw0KICBnZW9tX2FibGluZShpbnRlcmNlcHQgPSAwLCBzbG9wZSA9IDEsIGxpbmV0eXBlPSJkYXNoZWQiKSsNCiAgI2dlb21fYWJsaW5lKGludGVyY2VwdCA9IDAsIHNsb3BlID0gMC43LCBsaW5ldHlwZT0iZGFzaGVkIikrDQogIE5VTEwNCg0KcGxvdDENCg0KDQoNCmBgYA0KDQpgYGB7ciwgZWNobz1GQUxTRX0NCnBsb3QxICsgZ2VvbV9wb2ludChkYXRhPW1lcmdlZF90b3BfdGFibGVbbWVyZ2VkX3RvcF90YWJsZSRlbnRyZXpfSUQgPT0gIjExMTU3MjY4MiIsXSwgc2l6ZT0xLCBjb2xvcj0ibGlnaHRjb3JhbCIsIGFscGhhPTEpIA0KYGBgDQoNCkFsbHV2aWFsIHBsb3QNCg0KYGBge3IsIGVjaG89RkFMU0V9DQojcHJlcGFyZSB0YWJsZSBmb3IgYWxsdXZpYWwgcGxvdA0KYWxsdXZpYWxfZGYgPC0gbWVyZ2VkX3RvcF90YWJsZQ0KDQojZGltKGFsbHV2aWFsX2RmWygoYWxsdXZpYWxfZGYkYWRqLlAuVmFsX1QzSU9QIDw9IDAuMDUpICYgYWxsdXZpYWxfZGYkbG9nRkNfVDNJT1AgPj0gMSkgfCAoKGFsbHV2aWFsX2RmJGFkai5QLlZhbF9UM0lPUCA8PSAwLjA1KSAmIGFsbHV2aWFsX2RmJGxvZ0ZDX1QzSU9QIDwgLTEpLF0pDQoNCmFsbHV2aWFsX2RmIDwtIGFsbHV2aWFsX2RmW2FsbHV2aWFsX2RmJGFkai5QLlZhbF9UM0lPUCA8IDAuMDUsXQ0KYWxsdXZpYWxfZGYkREVfVDNJT1BbYWxsdXZpYWxfZGYkbG9nRkNfVDNJT1AgPj0gMSB8IGFsbHV2aWFsX2RmJGxvZ0ZDX1QzSU9QIDwgLTFdIDwtICJERSINCmFsbHV2aWFsX2RmIDwtIGFsbHV2aWFsX2RmWyFpcy5uYShhbGx1dmlhbF9kZiRERV9UM0lPUCksXQ0KDQoNCiNhbGx1dmlhbF9kZiRERV9UM0lPUCA8LSAibm8iDQphbGx1dmlhbF9kZiRERV9UM0lPUFthbGx1dmlhbF9kZiRsb2dGQ19UM0lPUCA+PSAxXSA8LSAiMS51cHJlZ3VsYXRlZCINCmFsbHV2aWFsX2RmJERFX1QzSU9QW2FsbHV2aWFsX2RmJGxvZ0ZDX1QzSU9QIDw9IC0xXSA8LSAiMi5kb3ducmVndWxhdGVkIg0KDQphbGx1dmlhbF9kZiRkaXJlY3Rpb24gPC0gIjEuc2FtZSINCmFsbHV2aWFsX2RmJGRpcmVjdGlvbltzaWduKGFsbHV2aWFsX2RmJEZDX1QzSU9QKSAhPSBzaWduKGFsbHV2aWFsX2RmJEZDX0NQRlQzSU9QKV0gPC0gIjIub3Bwb3NpdGUiDQoNCmFsbHV2aWFsX2RmJG1hZ25pdHV0ZGVfb2ZfY2hhbmdlIDwtICIxLmluY3JlYXNlZCINCmFsbHV2aWFsX2RmJG1hZ25pdHV0ZGVfb2ZfY2hhbmdlW2FicyhhbGx1dmlhbF9kZiRGQ19DUEZUM0lPUCkgPCBhYnMoYWxsdXZpYWxfZGYkRkNfVDNJT1ApXSA8LSAiMi5hdHRlbnVhdGVkIg0KYWxsdXZpYWxfZGYkbWFnbml0dXRkZV9vZl9jaGFuZ2VbYWxsdXZpYWxfZGYkZGlyZWN0aW9uID09ICIyLm9wcG9zaXRlIl0gPC0gIjMucmV2ZXJzZWQiDQoNCg0KDQoNCmBgYA0KDQoNCmBgYHtyLCB3YXJuaW5nPUZBTFNFLCBlY2hvPUZBTFNFfQ0KI3Bsb3QgYWxsdXZpYWwgcGxvdA0KbGlicmFyeShnZ2FsbHV2aWFsKQ0KDQoNCiNwYWxldHRlX1BkdW0gPC0gYygicGFsZWdyZWVuNCIsInBhbGVncmVlbjMiLCJwYWxlZ3JlZW4yIiwgICJsaWdodGNvcmFsIiwgImxpZ2h0cGluayIsIm1pc3R5cm9zZSIsICJkb2RnZXJibHVlMyIsImxpZ2h0c2t5Ymx1ZSIsICJsaWdodHNreWJsdWUxIiwgImxpZ2h0c2t5Ymx1ZTIiKQ0KDQpnZ3Bsb3QoYWxsdXZpYWxfZGYsDQogICAgICAgYWVzKGF4aXMxID0gYXMuZmFjdG9yKERFX1QzSU9QKSAsDQogICAgICAgICAgICNheGlzMiA9IGFzLmZhY3RvcihkaXJlY3Rpb24pLCANCiAgICAgICAgICAgYXhpczIgPSBhcy5mYWN0b3IobWFnbml0dXRkZV9vZl9jaGFuZ2UpKSkgKw0KICAjZ2VvbV9zdHJhdHVtKHdpZHRoID0gMS8xMiwgZmlsbCA9IGh1ZV9wYWwoKSgxMSksIGNvbG9yID0gImdyZXkiKSArDQogIGdlb21fc3RyYXR1bSh3aWR0aCA9IDEvMTIsIGZpbGwgPSBjKCJsaWdodGNvcmFsIiwgImZvcmVzdGdyZWVuIiwgImRvZGdlcmJsdWUiLCAibGlnaHRza3libHVlIiwgIm9yY2hpZCIpLCBjb2xvciA9ICJibGFjayIpICsNCiAgZ2VvbV9sYWJlbChzdGF0ID0gInN0cmF0dW0iLCBhZXMobGFiZWwgPSBhZnRlcl9zdGF0KHN0cmF0dW0pKSwgYWVzLmJpbmQgPSBUUlVFKSArDQogIGdlb21fZmxvdyhhZXMoZmlsbCA9IGZhY3RvcihtYWduaXR1dGRlX29mX2NoYW5nZSkpKSsNCiAgc2NhbGVfeF9kaXNjcmV0ZShsaW1pdHMgPSBjKCJUM0lPUF9ERSIsIk1hZ25pdHV0ZV9vZl9jaGFuZ2UiKSwgZXhwYW5kID0gYyguMDUsIC4wNSkpICsNCiAgI3NjYWxlX2ZpbGxfYnJld2VyKHR5cGUgPSAicXVhbCIsIHBhbGV0dGUgPSAiU2V0MSIpICsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygib3JjaGlkIiwgImxpZ2h0c2t5Ymx1ZSIsICJkb2RnZXJibHVlIikpKw0KICBnZ3RpdGxlKCJFZmZlY3RzIG9mIENQRi1kZGl0aW9uIHRvIFQzSU9QIikrDQogIHRoZW1lX2J3KCkrdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSsNCiAgdGhlbWUoI3BhbmVsLmJvcmRlciA9IGVsZW1lbnRfcmVjdChjb2xvcj0ibGlnaHRza3libHVlIiwgZmlsbD1OQSwgbGluZXdpZHRoPSAyKSwNCiAgICAgICAgICAgICAgICAgICBwbG90LnRpdGxlID0gZ2d0ZXh0OjplbGVtZW50X21hcmtkb3duKCksDQogICAgICAgICAgICAgICAgICAgcGxvdC5zdWJ0aXRsZSA9IGdndGV4dDo6ZWxlbWVudF9tYXJrZG93bigpKSsNCiAgTlVMTA0KDQoNCg0KYGBgDQpgYGB7ciwgZWNobz1GQUxTRX0NCmFsbHV2aWFsX2RmW2FsbHV2aWFsX2RmJERFX1QzSU9QID09ICIxLnVwcmVndWxhdGVkIiAmIGFsbHV2aWFsX2RmJGRpcmVjdGlvbiA9PSAiMi5vcHBvc2l0ZSIsXQ0KYGBgDQoNClZlbm4gZGlhZ3JhbXMNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KI2luc3RhbGwucGFja2FnZXMoInZlbm5ldWxlciIpDQojcmVxdWlyZSh2ZW5uZXVsZXIpDQp2IDwtIHZlbm5ldWxlcihjKEE9Njk1LCBCPTE3OCwgIkEmQiI9MzgwKSkNCnYgPC0gdmVubmV1bGVyKGMoQT0yNjcsIEI9ODAsICJBJkIiPTE2NSkpDQp2IDwtIHZlbm5ldWxlcihjKEE9MTc4LCBCPTgwLCAiQSZCIj0wKSkNCg0KdiA8LSB2ZW5uZXVsZXIoYyhBPTU1OCwgQj03MTUsICJBJkIiPTE3OSkpDQpwbG90KHYpDQpgYGANCg0KIyMjIFBhY2thZ2VzIHVzZWQNCg0KYGBge3IsIGVjaG89RkFMU0V9DQpzZXNzaW9uSW5mbygpDQpgYGANCg0KIyMgey19DQoNCioqKg0KX19BbmFseXNpcyBOb3RlYm9va19fPGJyIC8+DQpfUmV5bmF1ZCwgVmlhbmVsbG8sIGV0IGFsLiAiVGhlIG11bHRpLWxldmVsIGVmZmVjdCBvZiBjaGxvcnB5cmlmb3MgZHVyaW5nIGNsb3duZmlzaCBtZXRhbW9ycGhvc2lzIl88YnIgLz48YnIgLz4NCl9STm90ZWJvb2sgYnkgU3RlZmFubyBWaWFuZWxsbywgTWFyaW5lIEVjby1Fdm8tRGV2byB1bml0LCBBY2FkZW1pYSBTaW5pY2EgTWFyaW5lIFJlc2VhcmNoIFN0YXRpb25fIDxiciAvPg0KVGhpcyB3b3JrIGlzIGxpY2Vuc2VkIHVuZGVyIGEgPGEgcmVsPSJsaWNlbnNlIiBocmVmPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9saWNlbnNlcy9ieS1uYy80LjAvIj5DcmVhdGl2ZSBDb21tb25zIEF0dHJpYnV0aW9uLU5vbkNvbW1lcmNpYWwgNC4wIEludGVybmF0aW9uYWwgTGljZW5zZTwvYT4gd2l0aCB0aGUgYWRkaXRpb25hbCByZXNlcnZhdGlvbiBvZiB0aGUgcmlnaHRzIHRvIG5vbi1odW1hbiB0ZXh0IGFuZCBkYXRhIG1pbmluZywgQUkgdHJhaW5pbmcsIGFuZCBzaW1pbGFyIHRlY2hub2xvZ2llcywgd2hpY2ggYXJlIG5vdCBncmFudGVkLiA8YnIvPjxiciAvPg0KPGEgcmVsPSJsaWNlbnNlIiBocmVmPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9saWNlbnNlcy9ieS1uYy80LjAvIj48aW1nIGFsdD0iQ3JlYXRpdmUgQ29tbW9ucyBMaWNlbnNlIiBzdHlsZT0iYm9yZGVyLXdpZHRoOjAiIHNyYz0iaHR0cHM6Ly9pLmNyZWF0aXZlY29tbW9ucy5vcmcvbC9ieS1uYy80LjAvODh4MzEucG5nIiAvPjwvYT4gPGJyIC8+DQo=